
    N jp                     4   S SK Jr  S SKrS SKJrJr  S SKJr	  S SK
rS SKrS SKJr  SSKJrJr  SSKJr  SS	K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K#J$r$  SSK%J&r&J'r'  SSK(J)r)  SSK*J+r+  SSKJ,r,J-r-J.r.  S SK/J0r0  S SK1J2r2  S q3 " S S5      r4g)    )print_functionN)OptionalUnion)quote)requests   )utilscache)_MIC_TO_YAHOO_SUFFIX)YfData)YfConfig)YFDataExceptionYFEarningsDateMissingYFRateLimitError)	WebSocket)Analysis)Fundamentals)Holders)QuoteFastInfo)PriceHistory)	FundsData)
_BASE_URL_
_ROOT_URL__QUERY1_URL_)StringIO)BeautifulSoupc                      \ rS rSrS6S jr\R                  S\R                  4S j5       r	S r
S r\R                  S 5       rS7S	 jrS7S
 jrS7S jrS\4S jrS\4S jrS7S jrS7S jrS7S jrS7S jrS7S jrS7S jrS\4S jrS rS rS7S jrS\4S jrS7S jrS7S jrS7S jr S7S jr!S7S jr"S7S jr#S8S jr$S9S  jr%S9S! jr&S9S" jr'S9S# jr(S9S$ jr)S9S\*\R                  \4   4S% jjr+S9S& jr,S:S\RZ                  4S' jjr.S:S\RZ                  4S( jjr/S:S\RZ                  4S) jjr0S:S\RZ                  4S* jjr1S7S\*\R                  \4   4S+ jjr2\R                  S;S, j5       r3S\4\5   4S- jr6S<S\74S. jjr8S=S\4\R                     4S/ jjr9\R                  S=S\4\R                     4S0 jj5       r:\R                  S>S\4\R                     4S1 jj5       r;S\4S2 jr<S\4\=   4S3 jr>S?S4 jr?S5r@g)@
TickerBase6   Nc                 p   [        U[        5      (       a  [        U5      S:w  a  [        S5      eUu  p4UR	                  S5      (       a  USS nUR                  5       [        ;  a  [        SU S35      e[        UR                  5          nUS:w  a  U SU 3nOUnUR                  5       U l        U=(       d    [        R                  " S	S
9U l
        SU l        SU l        / U l        SU l        0 U l        SU l        SU l        U R                  S:X  a  [        S5      e[%        US9U l        [(        R*                  " U R                  5      (       a  U R                  n[,        R.                  " 5       nUR1                  U5      U l        U R                  (       d  [(        R2                  " U5      U l        U R                  S:X  a  [        SU 35      eU R                  (       a  UR5                  X`R                  5        SU l        [9        U R&                  U R                  5      U l        [=        U R&                  U R                  5      U l        [A        U R&                  U R                  5      U l!        [E        U R&                  U R                  5      U l#        SU l$        SU l%        SU l&        SU l'        g)a+  
Initialize a Yahoo Finance Ticker object.

Args:
    ticker (str | tuple[str, str]):
        Yahoo Finance symbol (e.g. "AAPL")
        or a tuple of (symbol, MIC) e.g. ('OR','XPAR')
        (MIC = market identifier code)

    session (requests.Session, optional):
        Custom requests session.
   z'Ticker tuple must be (symbol, mic_code).r   NzUnknown MIC code: '' chrome)impersonatezEmpty ticker name)sessionzInvalid ISIN number: )(
isinstancetuplelen
ValueError
startswithupperr   tickerr   Sessionr(   _tz_isin_news_shares_earnings_dates	_earnings_financialsr   _datar	   is_isinr
   get_isin_cachelookupget_ticker_by_isinstore_price_historyr   	_analysisr   _holdersr   _quoter   _fundamentals_funds_data
_fast_info_message_handlerws)selfr/   r(   base_symbolmic_codesfxisincs           ^/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/yfinance/base.py__init__TickerBase.__init__7   s'    fe$$6{a !JKK$*!K""3''#AB<~~';; #6xj!BCC&x~~'78Cby'=#/$llnH("2"2x"H

! ;;"011#G4
 ==%%;;D$$&A((4.DK;;#66t<{{b  #8!?@@{{kk* #!$**dkk:

DKK8DJJ4)$**dkkB $    returnc                 B    U R                  5       R                  " U0 UD6$ N)_lazy_load_price_historyhistory)rG   argskwargss      rM   rU   TickerBase.history   s!    ,,.66GGGrP   c                     U R                   c3  [        U R                  U R                  U R	                  SS95      U l         U R                   $ )N
   timeout)r>   r   r8   r/   _get_ticker_tzrG   s    rM   rT   #TickerBase._lazy_load_price_history   sB    &".tzz4;;H[H[dfH[Hg"hD"""rP   c                 >   U R                   b  U R                   $ [        R                  " 5       nUR                  U R                  5      nU(       a9  [
        R                  " U5      (       d  UR                  U R                  S 5        S nUc  U R                  U5      nUc<  [        S:  a2  [        S-  q	S H#  nX@R                  ;   d  M  U R                  U   n  O   [
        R                  " U5      (       a  UR                  U R                  U5        OS nX0l         U$ )Nr"   r   )exchangeTimezoneNametimeZoneFullName)r1   r
   get_tz_cacher;   r/   r	   is_valid_timezoner=   _fetch_ticker_tz_tz_info_fetch_ctrinfo)rG   r\   rL   tzks        rM   r]   TickerBase._get_ticker_tz   s    8888O XXdkk"e--b11GGDKK&B:&&w/Bz &) '!+&I		>!%1B! J &&r**R(	rP   c                 r   [         R                  " 5       nSSS.n[         SU R                   3n U R                  R                  XCUS9nUR                  5       nUR                  S0 5      R                  SS 5      nU(       a"  UR                  SU R                   SU 35        g  US   S	   S
   S   S   $ ! [         a  n[        R                  R                  (       d  e UR                  SU R                   SU 35        UR                  S5        UR                  S5        UR                  SU 35        UR                  S5         S nAg S nAff = f! [         a    e [         aK  n[        R                  R                  (       d  e UR                  SU R                   SU 35         S nAg S nAff = f)N1d)rangeintervalz/v8/finance/chart/)urlparamsr\   charterrorz$Got error from yahoo api for ticker z	, Error: resultr   metara   z/Could not get exchangeTimezoneName for ticker 'z
' reason: zGot response: z------------- zFailed to get ticker ')r	   get_yf_loggerr   r/   r8   	cache_getjsongetdebug	Exceptionr   hide_exceptionsrr   r   )	rG   r\   loggerrp   ro   datarr   erres	            rM   re   TickerBase._fetch_ticker_tz   s    $$&T2 .t{{m<	2::''C'PD99;D HHWb)--gt<ECDKK=PYZ_Y`ab 	2=215f=>TUU  2#>>99LL#RSWS^S^R__ijmin!opLL!12LL1LL1TF,LL112!   	 	>>11LL1$++jLM		s1   *E 'B8 8
EBEEF6+AF11F6c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )zf
Returns a DataFrame with the recommendations
Columns: period  strongBuy  buy  hold  sell  strongSell
)rA   recommendationsto_dictrG   as_dictr~   s      rM   get_recommendationsTickerBase.get_recommendations   s'    
 {{**<<>!rP   c                      U R                  US9$ )N)r   )r   )rG   r   s     rM   get_recommendations_summary&TickerBase.get_recommendations_summary   s    '''88rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )z
Returns a DataFrame with the recommendations changes (upgrades/downgrades)
Index: date of grade
Columns: firm toGrade fromGrade action
)rA   upgrades_downgradesr   r   s      rM   get_upgrades_downgrades"TickerBase.get_upgrades_downgrades   s'     {{..<<>!rP   c                 .    U R                   R                  $ rS   )rA   calendarr^   s    rM   get_calendarTickerBase.get_calendar   s    {{###rP   c                 .    U R                   R                  $ rS   )rA   sec_filingsr^   s    rM   get_sec_filingsTickerBase.get_sec_filings   s    {{&&&rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ rS   )r@   majorr   r   s      rM   get_major_holdersTickerBase.get_major_holders   s%    }}""<<>!rP   c                 h    U R                   R                  nUb  U(       a  UR                  5       $ U$ g rS   )r@   institutionalr   r   s      rM   get_institutional_holders$TickerBase.get_institutional_holders   s0    }}**||~%K rP   c                 h    U R                   R                  nUb  U(       a  UR                  5       $ U$ g rS   )r@   
mutualfundr   r   s      rM   get_mutualfund_holders!TickerBase.get_mutualfund_holders   s0    }}''||~%K rP   c                 h    U R                   R                  nUb  U(       a  UR                  5       $ U$ g rS   )r@   insider_purchasesr   r   s      rM   get_insider_purchases TickerBase.get_insider_purchases  s0    }}..||~%K rP   c                 h    U R                   R                  nUb  U(       a  UR                  5       $ U$ g rS   )r@   insider_transactionsr   r   s      rM   get_insider_transactions#TickerBase.get_insider_transactions  s0    }}11||~%K rP   c                 h    U R                   R                  nUb  U(       a  UR                  5       $ U$ g rS   )r@   insider_rosterr   r   s      rM   get_insider_roster_holders%TickerBase.get_insider_roster_holders  s0    }}++||~%K rP   c                 2    U R                   R                  nU$ rS   )rA   rg   rG   r~   s     rM   get_infoTickerBase.get_info  s    {{rP   c                 T    U R                   c  [        U 5      U l         U R                   $ rS   )rD   r   r^   s    rM   get_fast_infoTickerBase.get_fast_info  s!    ??"&tnDOrP   c                 2    U R                   R                  nU$ rS   )rA   valuation_measuresr   s     rM   get_valuation_measures!TickerBase.get_valuation_measures"  s    {{--rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ rS   )rA   sustainabilityr   r   s      rM   get_sustainabilityTickerBase.get_sustainability&  s%    {{))<<>!rP   c                 2    U R                   R                  nU$ )z*
Keys:   current  low  high  mean  median
)r?   analyst_price_targetsr   s     rM   get_analyst_price_targets$TickerBase.get_analyst_price_targets,  s     ~~33rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )z_
Index:      0q  +1q  0y  +1y
Columns:    numberOfAnalysts  avg  low  high  yearAgoEps  growth
)r?   earnings_estimater   r   s      rM   get_earnings_estimate TickerBase.get_earnings_estimate3  s&    
 ~~//!(t||~2d2rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )zc
Index:      0q  +1q  0y  +1y
Columns:    numberOfAnalysts  avg  low  high  yearAgoRevenue  growth
)r?   revenue_estimater   r   s      rM   get_revenue_estimateTickerBase.get_revenue_estimate;  &    
 ~~..!(t||~2d2rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )za
Index:      pd.DatetimeIndex
Columns:    epsEstimate  epsActual  epsDifference  surprisePercent
)r?   earnings_historyr   r   s      rM   get_earnings_historyTickerBase.get_earnings_historyC  r   rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )z]
Index:      0q  +1q  0y  +1y
Columns:    current  7daysAgo  30daysAgo  60daysAgo  90daysAgo
)r?   	eps_trendr   r   s      rM   get_eps_trendTickerBase.get_eps_trendK  s&     ~~''!(t||~2d2rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )zc
Index:      0q  +1q  0y  +1y
Columns:    upLast7days  upLast30days  downLast7days  downLast30days
)r?   eps_revisionsr   r   s      rM   get_eps_revisionsTickerBase.get_eps_revisionsT  s&     ~~++!(t||~2d2rP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ )zQ
Index:      0q  +1q  0y  +1y +5y -5y
Columns:    stock  industry  sector  index
)r?   growth_estimatesr   r   s      rM   get_growth_estimatesTickerBase.get_growth_estimates]  s&     ~~..!(t||~2d2rP   c                     U R                   R                  c  gU R                   R                  U   nU(       a6  UR                  5       nSU R                  ;  a  SOU R                  S   US'   U$ U$ )z
:Parameters:
    as_dict: bool
        Return table as Python dict
        Default is False
    freq: str
        "yearly" or "quarterly" or "trailing"
        Default is "yearly"
NfinancialCurrencyUSD)rB   earningsr   r6   )rG   r   freqr~   	dict_datas        rM   get_earningsTickerBase.get_earningsf  ss     &&.!!**40I6IQUQ_Q_6_Ueieses#f%I)*rP   c                     U R                   R                  R                  US9nU(       a7  UR                  5       n[        R
                  " UR                  S/ SQS9Ul        U(       a  UR                  5       $ U$ )a  
:Parameters:
    as_dict: bool
        Return table as Python dict
        Default is False
    pretty: bool
        Format row names nicely for readability
        Default is False
    freq: str
        "yearly" or "quarterly" or "trailing"
        Default is "yearly"
r   ru   )EBITEBITDAEPSNIsepacronyms)rB   
financialsget_income_time_seriescopyr	   camel2titleindexr   rG   r   prettyr   r~   s        rM   get_income_stmtTickerBase.get_income_stmt{  s`     !!,,CCCN99;D**4::3IhiDJ<<>!rP   c                 &    U R                  XU5      $ rS   r   rG   r   r   r   s       rM   get_incomestmtTickerBase.get_incomestmt      ##GT::rP   c                 &    U R                  XU5      $ rS   r   r   s       rM   get_financialsTickerBase.get_financials  r   rP   c                     U R                   R                  R                  US9nU(       a6  UR                  5       n[        R
                  " UR                  SS/S9Ul        U(       a  UR                  5       $ U$ a  
:Parameters:
    as_dict: bool
        Return table as Python dict
        Default is False
    pretty: bool
        Format row names nicely for readability
        Default is False
    freq: str
        "yearly" or "quarterly"
        Default is "yearly"
r   ru   PPEr   )rB   r   get_balance_sheet_time_seriesr   r	   r   r   r   r   s        rM   get_balance_sheetTickerBase.get_balance_sheet  sb     !!,,JJPTJU99;D**4::3%QDJ<<>!rP   c                 &    U R                  XU5      $ rS   )r  r   s       rM   get_balancesheetTickerBase.get_balancesheet  s    %%gt<<rP   c                     U R                   R                  R                  US9nU(       a6  UR                  5       n[        R
                  " UR                  SS/S9Ul        U(       a  UR                  5       $ U$ r   )rB   r   get_cash_flow_time_seriesr   r	   r   r   r   r   s        rM   get_cash_flowTickerBase.get_cash_flow  sa     !!,,FFDFQ99;D**4::3%QDJ<<>!rP   c                 &    U R                  XU5      $ rS   )r
  r   s       rM   get_cashflowTickerBase.get_cashflow  s    !!'488rP   c                 <    U R                  5       R                  US9$ N)period)rT   get_dividendsrG   r  s     rM   r  TickerBase.get_dividends  s    ,,.<<F<KKrP   c                 <    U R                  5       R                  US9$ r  )rT   get_capital_gainsr  s     rM   r  TickerBase.get_capital_gains  s    ,,.@@@OOrP   c                 <    U R                  5       R                  US9$ r  )rT   
get_splitsr  s     rM   r  TickerBase.get_splits  s    ,,.999HHrP   c                 <    U R                  5       R                  US9$ r  )rT   get_actionsr  s     rM   r  TickerBase.get_actions  s    ,,.::&:IIrP   c                 `    U R                   R                  nU(       a  UR                  5       $ U$ rS   )rB   sharesr   r   s      rM   
get_sharesTickerBase.get_shares  s'    !!((<<>!rP   c                 F   [         R                  " 5       nU R                  SS9n[        R                  R                  S5      R                  U5      nUb  [         R                  " X5      nUb  [         R                  " X$5      nUc  UnUc  U[        R                  " SS9-
  nX:  a  UR                  S5        g UR                  S5      nUR                  S5      nSU R                   S	U R                   3nU S
[        UR                  5       5       S[        UR                  5       5       3n U R                  R!                  US9nUR#                  5       n US   S   S   S:H  n	U	(       a]  [.        R0                  R2                  (       d  [(        R*                  R7                  S5      eUR                  U R                   S35        g US   S   n
SU
S   ;  a  g  [        R8                  " U
S   S   [        R:                  " U
S   S   SS9S9nUR>                  RA                  U5      Ul        URC                  5       nU$ ! [$        R&                  [(        R*                  R,                  4 aA    [.        R0                  R2                  (       d  e UR                  U R                   S35         g f = f! [4         a    Sn	 GN^f = f! [<         aJ  n[.        R0                  R2                  (       d  e UR                  U R                   SU 35         S nAg S nAff = f)NrZ   r[   UTCi$  )dayszStart date must be before endDzRhttps://query2.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/z?symbol=z	&period1=z	&period2=ro   z*: Yahoo web request for share count failedfinancerr   codezBad RequestFz8Yahoo web request for share count returned 'Bad Request'
timeseriesrs   
shares_outr   	timestamps)unit)r   z%: Failed to parse shares count data: )"r	   rv   r]   pd	Timestampnow
tz_convert_parse_user_dt	Timedeltarr   floorceilr/   intr+  r8   rw   rx   _jsonJSONDecodeErrorr   
exceptionsRequestExceptionr   rz   r|   KeyError	HTTPErrorSeriesto_datetimer{   r   tz_localize
sort_index)rG   startendr}   rh   dt_nowts_url_base
shares_url	json_datafailshares_datadfr   s                rM   get_shares_fullTickerBase.get_shares_full  s   $$&    ,!!%(33B7((3E?&&s/C;C=",,C00E<LL89C hhsm kkokvkvjww  AE  AL  AL  @M  N#}Ic%//2C.D-EYsSVS`S`SbOcNde
	

,,,<I!(I	Y'08MID >>11))334nooLLDKK=(RST-h7{1~-	;q>,7r~~kZ[n]hNips?tuB 88''+]]_	9 %%x':':'K'KL 	>>11LLDKK=(RST		  	D	  	>>11LLDKK=(MaSQR		s>   2)I J9 !4K A,J65J69K	K	
L A LL c                    U R                   b  U R                   $ U R                  R                  5       nSU;   d  SU;   a  SU l         U R                   $ UnU R                  R                  c  g SU R                  R                  ;   a  U R                  R                  S   nS[        U5       3nU R                  R                  US9R                  nSU S3nXT;  aP  UR                  5       UR                  5       ;   a  SnXT;  a  SU l         U R                   $ OSU l         U R                   $ UR                  U5      S	   R                  S5      S
   R                  S5      S
   U l         U R                   $ )N-^	shortNamezWhttps://markets.businessinsider.com/ajax/SearchController_Suggest?max_results=25&query=r&  "|z"|r   r   )r2   r/   r.   rA   rg   	urlencoder8   rw   textlowersplit)rG   r/   qro   r~   
search_strs         rM   get_isinTickerBase.get_isin  sO   ::!::""$&=C6MDJ::;;#$++***  -Aghqrshtguvzz###,11]
!wwyDJJL(!
)!$DJ::% * !
zz!ZZ
+A.44S9!<BB3GJ
zzrP   c           	         U R                   (       a  U R                   $ [        R                  " 5       nSSSS.nUR                  UR	                  5       5      nU(       d.  [        SU SSR                  UR                  5       5       35      e[         SU S	3nS
UU R                  /S.0nU R                  R                  XgS9nUb  SUR                  ;   a  [        S5      e UR                  5       nUR                  S0 5      R                  S0 5      R                  S/ 5      n	U	 V
s/ s H  oR                  S/ 5      (       a  M  U
PM     sn
U l         U R                   $ ! [        R                    aC    ["        R$                  R&                  (       d  e UR)                  U R                   S35        0 n Nf = fs  sn
f )z7Allowed options for tab: "news", "all", "press releasesnewsAll
latestNewspressRelease)allnewszpress releaseszInvalid tab name 'z'. Choose from: z, z/xhr/ncp?queryRef=z&serviceKey=ncp_finserviceConfig)snippetCountr,  )bodyzWill be right backz)*** YAHOO! FINANCE IS CURRENTLY DOWN! ***zC: Failed to retrieve the news and received faulty response instead.r~   tickerStreamstreamad)r3   r	   rv   ry   rT  r,   joinkeysr   r/   r8   postrS  r   rx   r7  r8  r   rz   r|   rr   )rG   counttabr}   tab_queryrefs	query_refro   payloadr~   r_  articles              rM   get_newsTickerBase.get_news>  s   ::::$$&  ,
 "%%ciik2	1#6FtyyQ^QcQcQeGfFghii.yk9LM %kk]
 zzs1</499<!"MNN	99;D xx#'';??"M-1OT'T29NgTO
zz $$ 	>>11LLDKK=(klmD		 Ps   #E! )F;F;!AF87F8c                     US:  a  [        S5      eU R                  (       a  XR                  ;   a  U R                  U   $ U R                  X5      nX0R                  U'   U$ )Nd   zYahoo caps limit at 100)r,   r5    _get_earnings_dates_using_scrape)rG   limitoffsetrI  s       rM   get_earnings_datesTickerBase.get_earnings_datesh  s]    3;677E-A-A$A''..225A&(U#	rP   c           	      @   US:  a	  US::  a  SnO)US:  a	  US::  a  SnOUS:  a	  US::  a  SnO[        S5      eSR                  U R                  X#5      nU R                  R	                  U5      n[        UR                  S5      nUR                  S5      nU(       GaC  [        U5      n[        U5      n	[        R                  " U	S	/S
9S   n
U
R                  SS/SS9n
U
R                  SS0SS9  U
R                  SS9n
U
S   R                  R                  SS5      U
S'   U
S   R                  R                  SS5      U
S'   U
S   R                  R!                  SSSS9nUS   nUS   n[        R"                  " USS9U
S'   [        R$                  " ['        U
S   U5       VVs/ s H  u  pUR)                  U5      PM     snn5      U
S'   U
R+                  S5      n
U
$ Sn[,        R.                  " 5       nUR1                  U R                   SU 35        gs  snnf )a  
Uses YfData.cache_get() to scrape earnings data from YahooFinance.
(https://finance.yahoo.com/calendar/earnings?symbol=INTC)

Args:
    limit (int): Number of rows to extract (max=100)
    offset (int): if 0, search from future EPS estimates. 
                  if 1, search from the most recent EPS. 
                  if x, search from x'th recent EPS. 

Returns:
    pd.DataFrame in the following format.

               EPS Estimate Reported EPS Surprise(%)
    Date
    2025-10-30         2.97            -           -
    2025-07-22         1.73         1.54      -10.88
    2025-05-06         2.63          2.7        2.57
    2025-02-06         2.09         2.42       16.06
    2024-10-31         1.92         1.55      -19.36
    ...                 ...          ...         ...
    2014-07-31         0.61         0.65        7.38
    2014-05-01         0.55         0.68       22.92
    2014-02-13         0.55         0.58        6.36
    2013-10-31         0.51         0.54        6.86
    2013-08-01         0.46          0.5        7.86
r      2   rr  zPlease use limit <= 100zGhttps://finance.yahoo.com/calendar/earnings?symbol={}&offset={}&size={}zhtml.parsertablerM  )	na_valuesSymbolCompanyr   )axisSurprise (%)Surprise(%)TcolumnsinplaceEarnings Date)subsetEDTzAmerica/New_YorkESTru   )nexpandz%B %d, %Y at %I %p)formatz/No earnings dates found, symbol may be delisted: N)r,   r  r/   r8   rw   r   rS  findstrr   r.  	read_htmldroprenamedropnareplacersplitr>  r=  zipr?  	set_indexr	   rv   rr   )rG   rt  ru  sizero   responsesoupr{  
table_htmlhtml_stringiorI  dt_partsdtstzsdtrh   err_msgr}   s                     rM   rs  +TickerBase._get_earnings_dates_using_scrapes  s)   @ 19"DRZERKDRZESLD677 X^^KK
 ::'', X]]M:		'"UJ %Z0M mu=a@B (I.Q7B II~}=tIL/2B #%_"5"9"9"A"A%I["\B"$_"5"9"9"A"A%I["\B/*..55cQt5LH1+C1+C"$..=Q"RB"$))cRTUdRegjNk,lNkFBR^^B-?Nk,l"mBo.B 		 HG((*FLLDKK=7)45 -ms   'H
c                    [         R                  " 5       n[         S3nSSS.nUSSU R                  /S.SS	S
/ SQS.nU R                  R                  X4US9nUR                  5       nUS   S   S   S   S   S    Vs/ s H  oS   PM	     n	nUS   S   S   S   S   S   n
[        R                  " XS9nUR                  (       aA  [        U R                  5      n[        U5      nUR                  U R                   SU 35        gUS   R                  SSSS9US'   US   R                  SSSS9US'   US   R                  SS SS9US'   [        R                  " US!   5      US"'   U R                  S#S$9nUS"   R                   R"                  c"  US"   R                   R%                  U5      US"'   O!US"   R                   R'                  U5      US"'   / S%QnX   R)                  S&5      R                  S'[*        R,                  5      X'   UR/                  S!S(/S)SS*9  UR1                  S"SS+9  UR3                  S,S-0SS.9  XR4                  U'   U$ s  snf )/aq  
Get earning dates (future and historic)

In Summer 2025, Yahoo stopped updating the data at this endpoint.
So reverting to scraping HTML.

Args:
    limit (int): max amount of upcoming and recent earnings dates to return.
        Default value 12 should return next 4 quarters and last 8 quarters.
        Increase if more history is needed.
Returns:
    pd.DataFrame
z/v1/finance/visualizationzen-USUS)langregioneqr/   )operatoroperandsstartdatetimeDESCr   )r  timeZoneShortNameepsestimate	epsactualepssurprisepct	eventtype)r  query	sortFieldsortTypeentityIdTypeincludeFields)rp   rb  r'  rs   r   	documentsr  labelrows)r  r  Nz
Event Typez^1$CallT)regexz^2$Earningsz^11$MeetingzEvent Start Dater     r[   )r  zEPS EstimatezReported EPSfloat64g        zTimezone short namer   )r  r  )r  r  r  r  )r	   rv   r   r/   r8   rh  rx   r.  	DataFrameemptyr   r  rr   r  r>  r]   r  rh   r?  r1  astypenpnanr  r  r  r5   )rG   rt  r}   ro   rp   rb  r  rF  rowr  r  rI  
_exceptionr  rh   columns_to_updates                   rM   "_get_earnings_dates_using_screener-TickerBase._get_earnings_dates_using_screener  s    $$& 78!T2#'h5LN(&~
 ::??3D?AMMO	 ,5Y+?+I!+L[+YZ[+\]f+gh+gCw<+gh#H-a0=a@H\\$088.t{{;J*oGLLDKK=7)45 l+33E63N<l+33E:T3R<l+33FIT3R< !nnR0B-CD?   ,o!!$$,"$_"5"8"8"D"DR"HB"$_"5"8"8"C"CB"GB M " 5 < <Y G O OPSUWU[U[ \ 	#%:;!TR
_d3
		>=94	H&(U#	I is   >Ic                 >    U R                  5       R                  5       $ rS   )rT   get_history_metadatar^   s    rM   r  TickerBase.get_history_metadata  s    ,,.CCEErP   c                     U R                   (       d%  [        U R                  U R                  5      U l         U R                   $ rS   )rC   r   r8   r/   r^   s    rM   get_funds_dataTickerBase.get_funds_data  s.    (T[[ADrP   c                     Xl         [        US9U l        U R                  R                  U R                  5        U R                  R                  U R                   5        g )N)verbose)rE   r   rF   	subscriber/   listen)rG   message_handlerr  s      rM   liveTickerBase.live!  s@     /G,$++&t,,-rP   )r?   r8   r6   r5   rD   r7   rB   rC   r@   r2   rE   r3   r>   rA   r4   r1   r(   r/   rF   rS   )F)Fyearly)FFr  )max)NN)rZ   r_  )   r   )r  )NT)A__name__
__module____qualname____firstlineno__rN   r	   log_indent_decoratorr.  r  rU   rT   r]   re   r   r   r   dictr   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   rJ  r   r  rX  listro  rv  rs  r  r  r   r  r  __static_attributes__ rP   rM   r   r   6   sU   FP H",, H  H
#
B $  $L9	$d $' '$ 
4 333333*.;;0=5QSQ]Q]_cQcKd 09LRYY LP PI")) IJ299 J5t1C+D  7  7r"(3- "H( (T	HR\\<R 	 \(SUS_S_J` \  \| Chr||>T C  CJFd F  3  .rP   r   )5
__future__r   rx   r7  typingr   r   urllib.parser   rR  numpyr  pandasr.  	curl_cffir   r%   r	   r
   constr   r~   r   configr   r9  r   r   r   r  r   scrapers.analysisr   scrapers.fundamentalsr   scrapers.holdersr   scrapers.quoter   r   scrapers.historyr   scrapers.fundsr   r   r   r   ior   bs4r   rf   r   r  rP   rM   <module>r     se   , &  " +     '   P P  ' / % + * % 7 7    p. p.rP   