
    U>qjLv                     <   d dl mZ d dlZd dlmZmZ d dlmZ	 d dl
Zd dlZddlmZmZ ddlmZmZ ddlmZ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dl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddlm.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d a5 G d d      Z6y)    )print_functionN)OptionalUnion)quote   )requestsnew_session)utilscache)_MIC_TO_YAHOO_SUFFIX
_SENTINEL_)YfData)YfConfig)YFDataExceptionYFEarningsDateMissingYFRateLimitError)	WebSocket)Analysis)Fundamentals)Holders)QuoteFastInfo)PriceHistory)	FundsData)
_BASE_URL_
_ROOT_URL__QUERY1_URL_)StringIO)BeautifulSoupc                      e Zd Zd4dZej
                  dej                  fd       Zd Z	d Z
ej
                  d        Zd5dZd5d	Zd5d
ZdefdZdefdZd5dZd5dZd5dZd5dZd5dZd5dZdefdZd Zd6dej                  fdZd5dZdefdZd5dZd5dZd5dZd5dZ d5dZ!d5dZ"d7dZ#d8dZ$d8d Z%d8d!Z&d8d"Z'd8d#Z(d8de)ej                  ef   fd$Z*d8d%Z+d9dejX                  fd&Z-d9dejX                  fd'Z.d9dejX                  fd(Z/d9dejX                  fd)Z0d5de)ej                  ef   fd*Z1ej
                  d:d+       Z2de3e4   fd,Z5d;de6fd-Z7d<de3ej                     fd.Z8ej
                  d<de3ej                     fd/       Z9ej
                  d=de3ej                     fd0       Z:e;fdefd1Z<de3e=   fd2Z>d>d3Z?y)?
TickerBaseNc                    t        |t              rt        |      dk7  rt        d      |\  }}|j	                  d      r|dd }|j                         t        vrt        d| d      t        |j                            }|dk7  r| d| }n|}|j                         | _        |xs
 t               | _	        d| _
        d| _        g | _        d| _        i | _        d| _        d| _        | j                  dk(  rt        d	      t#        |
      | _        t'        j(                  | j                        r| j                  }t+        j,                         }|j/                  |      | _        | j                  st'        j0                  |      | _        | j                  dk(  rt        d|       | j                  r|j3                  || j                         d| _        t7        | j$                  | j                        | _        t;        | j$                  | j                        | _        t?        | j$                  | j                        | _         tC        | j$                  | j                        | _"        d| _#        d| _$        d| _%        d| _&        y)as  
        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: '' zEmpty ticker name)sessionzInvalid ISIN number: )'
isinstancetuplelen
ValueError
startswithupperr   tickerr	   r'   _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           L/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/yfinance/base.py__init__zTickerBase.__init__7   s    fe$6{a !JKK$*!K""3'#AB<~~';; #6xj!BCC&x~~'78Cby'=#/$lln/+-

! ;;"011#G4
 ==%;;D$$&A((4.DK;;#66t<{{b  #8!?@@{{dkk* #!$**dkk:

DKK8DJJ4)$**dkkB $    returnc                 B     | j                         j                  |i |S N)_lazy_load_price_historyhistory)rE   argskwargss      rK   rR   zTickerBase.history   s#    6t,,.66GGGrM   c                     | j                   6t        | j                  | j                  | j	                  d            | _         | j                   S )N
   timeout)r<   r   r6   r.   _get_ticker_tzrE   s    rK   rQ   z#TickerBase._lazy_load_price_history   sB    &".tzz4;;H[H[dfH[Hg"hD"""rM   c                    | j                   | j                   S t        j                         }|j                  | j                        }|r3t        j                  |      s|j                  | j                  d        d }|| j                  |      }|8t        dk  r/t        dz  a	dD ]!  }|| j                  v s| j                  |   } n t        j                  |      r|j                  | j                  |       nd }|| _         |S )Nr#   r   )exchangeTimezoneNametimeZoneFullName)r/   r   get_tz_cacher9   r.   r
   is_valid_timezoner;   _fetch_ticker_tz_tz_info_fetch_ctrinfo)rE   rX   rJ   tzks        rK   rY   zTickerBase._get_ticker_tz   s    8888O XXdkk"e--b1GGDKK&B:&&w/Bz &) '!+&I "		>!%1B!" &&r*R(	rM   c                 T   t        j                         }ddd}t         d| j                   }	 | j                  j                  |||      }|j                         }|j                  di       j                  dd       }|r"|j                  d| j                   d|        y 	 |d   d	   d
   d   d   S # t        $ r}t        j                  j                  s |j                  d| j                   d|        |j                  d       |j                  d       |j                  d|        |j                  d       Y d }~y d }~ww xY w# t        $ r  t        $ rF}t        j                  j                  s |j                  d| j                   d|        Y d }~y d }~ww xY w)N1d)rangeintervalz/v8/finance/chart/)urlparamsrX   charterrorz$Got error from yahoo api for ticker z	, Error: resultr   metar\   z/Could not get exchangeTimezoneName for ticker 'z
' reason: zGot response: z------------- zFailed to get ticker ')r
   get_yf_loggerr   r.   r6   	cache_getjsongetdebug	Exceptionr   hide_exceptionsrl   r   )	rE   rX   loggerrj   ri   datarl   erres	            rK   r`   z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		s0   .E %B6 6	E?BEEF'!<F""F'c                 V    | j                   j                  }|r|j                         S |S )z~
        Returns a DataFrame with the recommendations
        Columns: period  strongBuy  buy  hold  sell  strongSell
        )r?   recommendationsto_dictrE   as_dictrx   s      rK   get_recommendationszTickerBase.get_recommendations   s'    
 {{**<<>!rM   c                 &    | j                  |      S )N)r   )r   )rE   r   s     rK   get_recommendations_summaryz&TickerBase.get_recommendations_summary   s    '''88rM   c                 V    | j                   j                  }|r|j                         S |S )z
        Returns a DataFrame with the recommendations changes (upgrades/downgrades)
        Index: date of grade
        Columns: firm toGrade fromGrade action
        )r?   upgrades_downgradesr}   r~   s      rK   get_upgrades_downgradesz"TickerBase.get_upgrades_downgrades   s'     {{..<<>!rM   c                 .    | j                   j                  S rP   )r?   calendarrZ   s    rK   get_calendarzTickerBase.get_calendar   s    {{###rM   c                 .    | j                   j                  S rP   )r?   sec_filingsrZ   s    rK   get_sec_filingszTickerBase.get_sec_filings   s    {{&&&rM   c                 V    | j                   j                  }|r|j                         S |S rP   )r>   majorr}   r~   s      rK   get_major_holderszTickerBase.get_major_holders   s%    }}""<<>!rM   c                 \    | j                   j                  }||r|j                         S |S y rP   )r>   institutionalr}   r~   s      rK   get_institutional_holdersz$TickerBase.get_institutional_holders   s0    }}**||~%K rM   c                 \    | j                   j                  }||r|j                         S |S y rP   )r>   
mutualfundr}   r~   s      rK   get_mutualfund_holdersz!TickerBase.get_mutualfund_holders   s0    }}''||~%K rM   c                 \    | j                   j                  }||r|j                         S |S y rP   )r>   insider_purchasesr}   r~   s      rK   get_insider_purchasesz TickerBase.get_insider_purchases  s0    }}..||~%K rM   c                 \    | j                   j                  }||r|j                         S |S y rP   )r>   insider_transactionsr}   r~   s      rK   get_insider_transactionsz#TickerBase.get_insider_transactions  s0    }}11||~%K rM   c                 \    | j                   j                  }||r|j                         S |S y rP   )r>   insider_rosterr}   r~   s      rK   get_insider_roster_holdersz%TickerBase.get_insider_roster_holders  s0    }}++||~%K rM   c                 2    | j                   j                  }|S rP   )r?   rb   rE   rx   s     rK   get_infozTickerBase.get_info  s    {{rM   c                 R    | j                   t        |       | _         | j                   S rP   )rB   r   rZ   s    rK   get_fast_infozTickerBase.get_fast_info  s!    ??"&tnDOrM   c                 :    | j                   j                  ||      S )u  Valuation measures (market cap, P/E, P/S, P/B, EV/EBITDA, ...).

        Returns a DataFrame with the 9 valuation measures as rows and a
        ``Current`` column plus period-end date columns (newest first). Values
        are raw numeric measures (floats, with ``NaN`` for missing cells); the
        date column labels remain ``"M/D/YYYY"`` strings.

        Args:
            freq: period columns to return — "quarterly" (default), "monthly",
                "yearly" or "trailing". The "Current" column always reflects the
                latest trailing value.
            periods: cap on the number of period (date) columns returned, newest
                first. An int >= 0 or None. The default of 5 matches the column
                count the old key-statistics page showed; ``periods=0`` returns
                only the "Current" column; ``None`` returns all available history.
                The ``valuation`` property uses this default — call the method
                form to control ``periods``.
        )r?   get_valuation_measures)rE   freqperiodss      rK   r   z!TickerBase.get_valuation_measures"  s    & {{11$@@rM   c                 V    | j                   j                  }|r|j                         S |S rP   )r?   sustainabilityr}   r~   s      rK   get_sustainabilityzTickerBase.get_sustainability7  s%    {{))<<>!rM   c                 2    | j                   j                  }|S )z:
        Keys:   current  low  high  mean  median
        )r=   analyst_price_targetsr   s     rK   get_analyst_price_targetsz$TickerBase.get_analyst_price_targets=  s     ~~33rM   c                 V    | j                   j                  }|r|j                         S |S )zw
        Index:      0q  +1q  0y  +1y
        Columns:    numberOfAnalysts  avg  low  high  yearAgoEps  growth
        )r=   earnings_estimater}   r~   s      rK   get_earnings_estimatez TickerBase.get_earnings_estimateD  s&    
 ~~//!(t||~2d2rM   c                 V    | j                   j                  }|r|j                         S |S )z{
        Index:      0q  +1q  0y  +1y
        Columns:    numberOfAnalysts  avg  low  high  yearAgoRevenue  growth
        )r=   revenue_estimater}   r~   s      rK   get_revenue_estimatezTickerBase.get_revenue_estimateL  &    
 ~~..!(t||~2d2rM   c                 V    | j                   j                  }|r|j                         S |S )zy
        Index:      pd.DatetimeIndex
        Columns:    epsEstimate  epsActual  epsDifference  surprisePercent
        )r=   earnings_historyr}   r~   s      rK   get_earnings_historyzTickerBase.get_earnings_historyT  r   rM   c                 V    | j                   j                  }|r|j                         S |S )zu
        Index:      0q  +1q  0y  +1y
        Columns:    current  7daysAgo  30daysAgo  60daysAgo  90daysAgo
        )r=   	eps_trendr}   r~   s      rK   get_eps_trendzTickerBase.get_eps_trend\  s&     ~~''!(t||~2d2rM   c                 V    | j                   j                  }|r|j                         S |S )z{
        Index:      0q  +1q  0y  +1y
        Columns:    upLast7days  upLast30days  downLast7days  downLast30days
        )r=   eps_revisionsr}   r~   s      rK   get_eps_revisionszTickerBase.get_eps_revisionse  s&     ~~++!(t||~2d2rM   c                 V    | j                   j                  }|r|j                         S |S )zi
        Index:      0q  +1q  0y  +1y +5y -5y
        Columns:    stock  industry  sector  index
        )r=   growth_estimatesr}   r~   s      rK   get_growth_estimateszTickerBase.get_growth_estimatesn  s&     ~~..!(t||~2d2rM   c                     | j                   j                  y| j                   j                  |   }|r4|j                         }d| j                  vrdn| j                  d   |d<   |S |S )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)r@   earningsr}   r4   )rE   r   r   rx   	dict_datas        rK   get_earningszTickerBase.get_earningsw  ss     &&.!!**40I6IQUQ_Q_6_Ueieses#f%I)*rM   c                     | j                   j                  j                  |      }|r9|j                         }t	        j
                  |j                  dg d      |_        |r|j                         S |S )ag  
        :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   ro   )EBITEBITDAEPSNIsepacronyms)r@   
financialsget_income_time_seriescopyr
   camel2titleindexr}   rE   r   prettyr   rx   s        rK   get_income_stmtzTickerBase.get_income_stmt  s`     !!,,CCCN99;D**4::3IhiDJ<<>!rM   c                 (    | j                  |||      S rP   r   rE   r   r   r   s       rK   get_incomestmtzTickerBase.get_incomestmt      ##GVT::rM   c                 (    | j                  |||      S rP   r   r   s       rK   get_financialszTickerBase.get_financials  r   rM   c                     | j                   j                  j                  |      }|r8|j                         }t	        j
                  |j                  ddg      |_        |r|j                         S |S aY  
        :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   ro   PPEr   )r@   r   get_balance_sheet_time_seriesr   r
   r   r   r}   r   s        rK   get_balance_sheetzTickerBase.get_balance_sheet  sb     !!,,JJPTJU99;D**4::3%QDJ<<>!rM   c                 (    | j                  |||      S rP   )r   r   s       rK   get_balancesheetzTickerBase.get_balancesheet  s    %%gvt<<rM   c                     | j                   j                  j                  |      }|r8|j                         }t	        j
                  |j                  ddg      |_        |r|j                         S |S r   )r@   r   get_cash_flow_time_seriesr   r
   r   r   r}   r   s        rK   get_cash_flowzTickerBase.get_cash_flow  sa     !!,,FFDFQ99;D**4::3%QDJ<<>!rM   c                 (    | j                  |||      S rP   )r   r   s       rK   get_cashflowzTickerBase.get_cashflow  s    !!'6488rM   c                 B    | j                         j                  |      S N)period)rQ   get_dividendsrE   r   s     rK   r   zTickerBase.get_dividends  s    ,,.<<F<KKrM   c                 B    | j                         j                  |      S r   )rQ   get_capital_gainsr   s     rK   r   zTickerBase.get_capital_gains  s    ,,.@@@OOrM   c                 B    | j                         j                  |      S r   )rQ   
get_splitsr   s     rK   r   zTickerBase.get_splits  s    ,,.999HHrM   c                 B    | j                         j                  |      S r   )rQ   get_actionsr   s     rK   r   zTickerBase.get_actions  s    ,,.::&:IIrM   c                 V    | j                   j                  }|r|j                         S |S rP   )r@   sharesr}   r~   s      rK   
get_shareszTickerBase.get_shares  s'    !!((<<>!rM   c                 "   t        j                         }| j                  d      }t        j                  j                  d      j                  |      }|t        j                  ||      }|t        j                  ||      }||}||t        j                  d      z
  }||k\  r|j                  d       y |j                  d      }|j                  d      }d| j                   d	| j                   }| d
t        |j                                dt        |j                                }	 | j                  j!                  |      }|j#                         }	 |d   d   d   dk(  }	|	rXt.        j0                  j2                  st(        j*                  j7                  d      |j                  | j                   d       y |d   d   }
d|
d   vry 	 t        j8                  |
d   d   t        j:                  |
d   d   d            }|j>                  jA                  |      |_        |jC                         }|S # t$        j&                  t(        j*                  j,                  f$ r< t.        j0                  j2                  s |j                  | j                   d       Y y w xY w# t4        $ r d}	Y Ow xY w# t<        $ rE}t.        j0                  j2                  s |j                  | j                   d|        Y d }~y d }~ww xY w)NrV   rW   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=ri   z*: Yahoo web request for share count failedfinancerl   codezBad RequestFz8Yahoo web request for share count returned 'Bad Request'
timeseriesrm   
shares_outr   	timestamps)unit)r   z%: Failed to parse shares count data: )"r
   rp   rY   pd	Timestampnow
tz_convert_parse_user_dt	Timedeltarl   floorceilr.   intr  r6   rq   rr   _jsonJSONDecodeErrorr   
exceptionsRequestExceptionr   rt   rv   KeyError	HTTPErrorSeriesto_datetimeru   r   tz_localize
sort_index)rE   startendrw   rc   dt_nowts_url_base
shares_url	json_datafailshares_datadfrz   s                rK   get_shares_fullzTickerBase.get_shares_full  s   $$&    ,!!%(33B7((3E?&&sB/C;C=",,C00EC<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 J. 8K  A&J+*J+.J=<J= 	L	;L		Lc                    | j                   | j                   S | j                  j                         }d|v sd|v rd| _         | j                   S |}| j                  j                  y d| j                  j                  v r| j                  j                  d   }dt        |       }| j                  j                  |      j                  }d| d}||vrL|j                         |j                         v rd}||vr&d| _         | j                   S d| _         | j                   S |j                  |      d	   j                  d      d
   j                  d      d
   | _         | j                   S )N-^	shortNamezWhttps://markets.businessinsider.com/ajax/SearchController_Suggest?max_results=25&query=r   "|z"|r   r   )r0   r.   r-   r?   rb   	urlencoder6   rq   textlowersplit)rE   r.   qri   rx   
search_strs         rK   get_isinzTickerBase.get_isin+  sL   ::!::""$&=C6MDJ::;;#$++***  -Aghqrshtguvzz###,11]
T!wwyDJJL(!
T)!$DJ::% 
zz!ZZ
+A.44S9!<BB3GJ
zzrM   c           	      P   | j                   r| j                   S t        j                         }dddd}|j                  |j	                               }|s.t        d| ddj                  |j                                      t         d| d	}d
|| j                  gdi}| j                  j                  ||      }|d|j                  v rt        d      	 |j                         }|j                  di       j                  di       j                  dg       }	|	D 
cg c]  }
|
j                  dg       r|
 c}
| _         | j                   S # t        j                   $ r> t"        j$                  j&                  s |j)                  | j                   d       i }Y w xY wc c}
w )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.rx   tickerStreamstreamad)r1   r
   rp   rs   r)  r+   joinkeysr   r.   r6   postr(  r   rr   r  r  r   rt   rv   rl   )rE   counttabrw   tab_queryrefs	query_refri   payloadrx   r3  articles              rK   get_newszTickerBase.get_newsO  s   ::::$$&  ,
 "%%ciik2	1#6FtyyQ^QcQcQeGfFghii.yk9LM %kk]
 zzs1</499<!"MNN	99;D xx#'';??"M-1O'T29NgO
zz $$ 	>>11LLDKK=(klmD		 Ps   E F#7F#AF F c                     |dkD  rt        d      | j                  r|| j                  v r| j                  |   S | j                  ||      }|| j                  |<   |S )Nd   zYahoo caps limit at 100)r+   r3    _get_earnings_dates_using_scrape)rE   limitoffsetr  s       rK   get_earnings_dateszTickerBase.get_earnings_datesy  sc    3;677ET-A-A$A''..225&A&(U#	rM   c           	      D   |dkD  r|dk  rd}n%|dkD  r|dk  rd}n|dkD  r|dk  rd}nt        d      dj                  | j                  ||      }| j                  j	                  |      }t        |j                  d      }|j                  d      }|rPt        |      }t        |      }	t        j                  |	d	g
      d   }
|
j                  ddgd      }
|
j                  ddid       |
j                  d      }
|
d   j                  j                  dd      |
d<   |
d   j                  j                  dd      |
d<   |
d   j                  j!                  ddd      }|d   }|d   }t        j"                  |d      |
d<   t        j$                  t'        |
d   |      D cg c]  \  }}|j)                  |       c}}      |
d<   |
j+                  d      }
|
S d}t-        j.                         }|j1                  | j                   d|        yc c}}w )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   rE  zPlease use limit <= 100zGhttps://finance.yahoo.com/calendar/earnings?symbol={}&offset={}&size={}zhtml.parsertabler"  )	na_valuesSymbolCompanyr   )axisSurprise (%)Surprise(%)TcolumnsinplaceEarnings Date)subsetEDTzAmerica/New_YorkESTro   )nexpandz%B %d, %Y at %I %p)formatz/No earnings dates found, symbol may be delisted: N)r+   r]  r.   r6   rq   r   r(  findstrr   r  	read_htmldroprenamedropnareplacersplitr  r  zipr  	set_indexr
   rp   rl   )rE   rG  rH  sizeri   responsesouprM  
table_htmlhtml_stringior  dt_partsdtstzsdtrc   err_msgrw   s                     rK   rF  z+TickerBase._get_earnings_dates_using_scrape  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,lFBR^^B-?,l"mBo.B 		 HG((*FLLDKK=7)45 -ms   ,H
c                 6   t        j                         }t         d}t        j                  j
                  t        j                  j                  d}|dd| j                  gddddg d	d
}| j                  j                  |||      }|j                         }|d   d   d   d   d   d   D cg c]  }|d   	 }	}|d   d   d   d   d   d   }
t        j                  |
|	      }|j                  rAt        | j                        }t        |      }|j!                  | j                   d|        y|d   j#                  ddd      |d<   |d   j#                  ddd      |d<   |d   j#                  ddd      |d<   t        j$                  |d         |d <   | j'                  d!"      }|d    j(                  j*                  "|d    j(                  j-                  |      |d <   n!|d    j(                  j/                  |      |d <   g d#}||   j1                  d$      j#                  d%t2        j4                        ||<   |j7                  dd&gd'd(       |j9                  d d)       |j;                  d*d+id,       || j<                  |<   |S c c}w )-a  
        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/visualization)langregioneqr.   )operatoroperandsstartdatetimeDESCr   )ry  timeZoneShortNameepsestimate	epsactualepssurprisepct	eventtype)ri  query	sortFieldsortTypeentityIdTypeincludeFields)rj   r6  r   rm   r   	documentsrU  labelrows)rU  r^  Nz
Event Typez^1$CallT)regexz^2$Earningsz^11$MeetingzEvent Start DaterW     rW   )rR  zEPS EstimatezReported EPSfloat64g        zTimezone short namer   )rQ  rV  )rV  rR  rS  rT  )r
   rp   r   r   localert  ru  r.   r6   r<  rr   r  	DataFrameemptyr   r`  rl   re  r  rY   rq  rc   r  r  astypenpnanrb  rh  rc  r3   )rE   rG  rw   ri   rj   r6  rj  r  rowrU  r  r  
_exceptionrr  rc   columns_to_updates                   rK   "_get_earnings_dates_using_screenerz-TickerBase._get_earnings_dates_using_screener  s    $$& 78"//..(//:P:PQ#'h5LN(&~
 ::??3vD?AMMO	 ,5Y+?+I!+L[+YZ[+\]f+ghC3w<h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 "#4 5 < <Y G O OPSUWU[U[ \ 	#%:;!TR
_d3
		>=94	H&(U#	I is   1Jc                 B    | j                         j                  |      S )z
        repair default value depends on whether user requested price repair
        with previous history() call. If user did not set repair here, then
        it is set to match previous history() call.
        )repair)rQ   get_history_metadata)rE   r  s     rK   r  zTickerBase.get_history_metadata)  s!     ,,.CC6CRRrM   c                 |    | j                   s%t        | j                  | j                        | _         | j                   S rP   )rA   r   r6   r.   rZ   s    rK   get_funds_datazTickerBase.get_funds_data1  s.    (T[[ADrM   c                     || _         t        |      | _        | j                  j                  | j                         | j                  j                  | j                          y )N)verbose)rC   r   rD   	subscriber.   listen)rE   message_handlerr  s      rK   livezTickerBase.live7  sB     /G,$++&t,,-rM   rP   )F)	quarterly   )Fyearly)FFr  )max)NN)rV   r3  )   r   )r  )NT)@__name__
__module____qualname__rL   r
   log_indent_decoratorr  r  rR   rQ   rY   r`   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   r   r   r`  r-  listrC  rI  rF  r  r   r  r   r  r   rM   rK   r!   r!   6   sg   FP H",, H  H
#
B $  $L9	$d $' '$ 
AR\\ A*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 +5 S S  3  .rM   r!   )7
__future__r   rr   r  typingr   r   urllib.parser   r'  numpyr  pandasr  _httpr   r	   r&   r
   r   constr   r   rx   r   configr   r  r   r   r   r  r   scrapers.analysisr   scrapers.fundamentalsr   scrapers.holdersr   scrapers.quoter   r   scrapers.historyr   scrapers.fundsr   r   r   r   ior   bs4r   ra   r!   r  rM   rK   <module>r     se   , &  " +   (  3   P P  ' / % + * % 7 7    F. F.rM   