
    uUip                     4   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 ddlmZmZ ddl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-m.Z. d dl/m0Z0 d dl1m2Z2 d a3 G d d      Z4y)    )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                   v   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d Zd5dZdefdZd5dZd5dZd5dZd5dZ d5dZ!d5dZ"d6dZ#d7dZ$d7d Z%d7d!Z&d7d"Z'd7d#Z(d7de)ej                  ef   fd$Z*d7d%Z+d8dejX                  fd&Z-d8dejX                  fd'Z.d8dejX                  fd(Z/d8dejX                  fd)Z0d5de)ej                  ef   fd*Z1ej
                  d9d+       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:defd1Z;de3e<   fd2Z=d=d3Z>y)>
TickerBaseNc                 0   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        j                  d	
      | _
        d| _        d| _        g | _        d| _        i | _        d| _        d| _        | j                  dk(  rt        d      t%        |      | _        t)        j*                  | j                        r| j                  }t-        j.                         }|j1                  |      | _        | j                  st)        j2                  |      | _        | j                  dk(  rt        d|       | j                  r|j5                  || j                         d| _        t9        | j&                  | j                        | _        t=        | j&                  | j                        | _        tA        | j&                  | j                        | _!        tE        | 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: '' 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           @/home/agent/.local/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H("2"2x"H

! ;;"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)rF   argskwargss      rL   rS   zTickerBase.history   s#    6t,,.66GGGrN   c                     | j                   6t        | j                  | j                  | j	                  d            | _         | j                   S )N
   timeout)r=   r   r7   r.   _get_ticker_tzrF   s    rL   rR   z#TickerBase._lazy_load_price_history   sB    &".tzz4;;H[H[dfH[Hg"hD"""rN   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)r0   r
   get_tz_cacher:   r.   r	   is_valid_timezoner<   _fetch_ticker_tz_tz_info_fetch_ctrinfo)rF   rY   rK   tzks        rL   rZ   zTickerBase._get_ticker_tz   s    8888O XXdkk"e--b1GGDKK&B:&&w/Bz &) '!+&I "		>!%1B!" &&r*R(	rN   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paramsrY   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.   r7   	cache_getjsongetdebug	Exceptionr   hide_exceptionsrm   r   )	rF   rY   loggerrk   rj   datarm   erres	            rL   ra   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rF   as_dictry   s      rL   get_recommendationszTickerBase.get_recommendations   s'    
 {{**<<>!rN   c                 &    | j                  |      S )N)r   )r   )rF   r   s     rL   get_recommendations_summaryz&TickerBase.get_recommendations_summary   s    '''88rN   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      rL   get_upgrades_downgradesz"TickerBase.get_upgrades_downgrades   s'     {{..<<>!rN   c                 .    | j                   j                  S rQ   )r@   calendarr[   s    rL   get_calendarzTickerBase.get_calendar   s    {{###rN   c                 .    | j                   j                  S rQ   )r@   sec_filingsr[   s    rL   get_sec_filingszTickerBase.get_sec_filings   s    {{&&&rN   c                 V    | j                   j                  }|r|j                         S |S rQ   )r?   majorr~   r   s      rL   get_major_holderszTickerBase.get_major_holders   s%    }}""<<>!rN   c                 \    | j                   j                  }||r|j                         S |S y rQ   )r?   institutionalr~   r   s      rL   get_institutional_holdersz$TickerBase.get_institutional_holders   s0    }}**||~%K rN   c                 \    | j                   j                  }||r|j                         S |S y rQ   )r?   
mutualfundr~   r   s      rL   get_mutualfund_holdersz!TickerBase.get_mutualfund_holders   s0    }}''||~%K rN   c                 \    | j                   j                  }||r|j                         S |S y rQ   )r?   insider_purchasesr~   r   s      rL   get_insider_purchasesz TickerBase.get_insider_purchases  s0    }}..||~%K rN   c                 \    | j                   j                  }||r|j                         S |S y rQ   )r?   insider_transactionsr~   r   s      rL   get_insider_transactionsz#TickerBase.get_insider_transactions  s0    }}11||~%K rN   c                 \    | j                   j                  }||r|j                         S |S y rQ   )r?   insider_rosterr~   r   s      rL   get_insider_roster_holdersz%TickerBase.get_insider_roster_holders  s0    }}++||~%K rN   c                 2    | j                   j                  }|S rQ   )r@   rc   rF   ry   s     rL   get_infozTickerBase.get_info  s    {{rN   c                 R    | j                   t        |       | _         | j                   S rQ   )rC   r   r[   s    rL   get_fast_infozTickerBase.get_fast_info  s!    ??"&tnDOrN   c                 2    | j                   j                  }|S rQ   )r@   valuation_measuresr   s     rL   get_valuation_measuresz!TickerBase.get_valuation_measures"  s    {{--rN   c                 V    | j                   j                  }|r|j                         S |S rQ   )r@   sustainabilityr~   r   s      rL   get_sustainabilityzTickerBase.get_sustainability&  s%    {{))<<>!rN   c                 2    | j                   j                  }|S )z:
        Keys:   current  low  high  mean  median
        )r>   analyst_price_targetsr   s     rL   get_analyst_price_targetsz$TickerBase.get_analyst_price_targets,  s     ~~33rN   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      rL   get_earnings_estimatez TickerBase.get_earnings_estimate3  s&    
 ~~//!(t||~2d2rN   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      rL   get_revenue_estimatezTickerBase.get_revenue_estimate;  &    
 ~~..!(t||~2d2rN   c                 V    | j                   j                  }|r|j                         S |S )zy
        Index:      pd.DatetimeIndex
        Columns:    epsEstimate  epsActual  epsDifference  surprisePercent
        )r>   earnings_historyr~   r   s      rL   get_earnings_historyzTickerBase.get_earnings_historyC  r   rN   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      rL   get_eps_trendzTickerBase.get_eps_trendK  s&     ~~''!(t||~2d2rN   c                 V    | j                   j                  }|r|j                         S |S )z{
        Index:      0q  +1q  0y  +1y
        Columns:    upLast7days  upLast30days  downLast7days  downLast30days
        )r>   eps_revisionsr~   r   s      rL   get_eps_revisionszTickerBase.get_eps_revisionsT  s&     ~~++!(t||~2d2rN   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      rL   get_growth_estimateszTickerBase.get_growth_estimates]  s&     ~~..!(t||~2d2rN   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)rA   earningsr~   r5   )rF   r   freqry   	dict_datas        rL   get_earningszTickerBase.get_earningsf  ss     &&.!!**40I6IQUQ_Q_6_Ueieses#f%I)*rN   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   rp   )EBITEBITDAEPSNIsepacronyms)rA   
financialsget_income_time_seriescopyr	   camel2titleindexr~   rF   r   prettyr   ry   s        rL   get_income_stmtzTickerBase.get_income_stmt{  s`     !!,,CCCN99;D**4::3IhiDJ<<>!rN   c                 (    | j                  |||      S rQ   r   rF   r   r   r   s       rL   get_incomestmtzTickerBase.get_incomestmt      ##GVT::rN   c                 (    | j                  |||      S rQ   r   r   s       rL   get_financialszTickerBase.get_financials  r   rN   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   rp   PPEr   )rA   r   get_balance_sheet_time_seriesr   r	   r   r   r~   r   s        rL   get_balance_sheetzTickerBase.get_balance_sheet  sb     !!,,JJPTJU99;D**4::3%QDJ<<>!rN   c                 (    | j                  |||      S rQ   )r   r   s       rL   get_balancesheetzTickerBase.get_balancesheet  s    %%gvt<<rN   c                     | j                   j                  j                  |      }|r8|j                         }t	        j
                  |j                  ddg      |_        |r|j                         S |S r   )rA   r   get_cash_flow_time_seriesr   r	   r   r   r~   r   s        rL   get_cash_flowzTickerBase.get_cash_flow  sa     !!,,FFDFQ99;D**4::3%QDJ<<>!rN   c                 (    | j                  |||      S rQ   )r   r   s       rL   get_cashflowzTickerBase.get_cashflow  s    !!'6488rN   c                 B    | j                         j                  |      S N)period)rR   get_dividendsrF   r   s     rL   r   zTickerBase.get_dividends  s    ,,.<<F<KKrN   c                 B    | j                         j                  |      S r   )rR   get_capital_gainsr   s     rL   r   zTickerBase.get_capital_gains  s    ,,.@@@OOrN   c                 B    | j                         j                  |      S r   )rR   
get_splitsr   s     rL   r   zTickerBase.get_splits  s    ,,.999HHrN   c                 B    | j                         j                  |      S r   )rR   get_actionsr   s     rL   r   zTickerBase.get_actions  s    ,,.::&:IIrN   c                 V    | j                   j                  }|r|j                         S |S rQ   )rA   sharesr~   r   s      rL   
get_shareszTickerBase.get_shares  s'    !!((<<>!rN   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)NrW   rX   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=rj   z*: Yahoo web request for share count failedfinancerm   codezBad RequestFz8Yahoo web request for share count returned 'Bad Request'
timeseriesrn   
shares_outr   	timestamps)unit)r   z%: Failed to parse shares count data: )"r	   rq   rZ   pd	Timestampnow
tz_convert_parse_user_dt	Timedeltarm   floorceilr.   intr  r7   rr   rs   _jsonJSONDecodeErrorr   
exceptionsRequestExceptionr   ru   rw   KeyError	HTTPErrorSeriesto_datetimerv   r   tz_localize
sort_index)rF   startendrx   rd   dt_nowts_url_base
shares_url	json_datafailshares_datadfr{   s                rL   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   )r1   r.   r-   r@   rc   	urlencoder7   rr   textlowersplit)rF   r.   qrj   ry   
search_strs         rL   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rN   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.ry   tickerStreamstreamad)r2   r	   rq   rt   r*  r+   joinkeysr   r.   r7   postr)  r   rs   r  r  r   ru   rw   rm   )rF   counttabrx   tab_queryrefs	query_refrj   payloadry   r4  articles              rL   get_newsz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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+   r4    _get_earnings_dates_using_scrape)rF   limitoffsetr   s       rL   get_earnings_dateszTickerBase.get_earnings_datesh  sc    3;677ET-A-A$A''..225&A&(U#	rN   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   rF  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ESTrp   )nexpandz%B %d, %Y at %I %p)formatz/No earnings dates found, symbol may be delisted: N)r+   r^  r.   r7   rr   r   r)  findstrr   r  	read_htmldroprenamedropnareplacersplitr  r  zipr  	set_indexr	   rq   rm   )rF   rH  rI  sizerj   responsesouprN  
table_htmlhtml_stringior   dt_partsdtstzsdtrd   err_msgrx   s                     rL   rG  z+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,lFBR^^B-?,l"mBo.B 		 HG((*FLLDKK=7)45 -ms   ,H
c                    t        j                         }t         d}dd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%}||   j)                  d&      j                  d't*        j,                        ||<   |j/                  d!d(gd)d*       |j1                  d"d+       |j3                  d,d-id.       || j4                  |<   |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/visualizationzen-USUS)langregioneqr.   )operatoroperandsstartdatetimeDESCr   )r{  timeZoneShortNameepsestimate	epsactualepssurprisepct	eventtype)rj  query	sortFieldsortTypeentityIdTypeincludeFields)rk   r7  r   rn   r   	documentsrV  labelrows)rV  r_  Nz
Event Typez^1$CallT)regexz^2$Earningsz^11$MeetingzEvent Start DaterX     rX   )rS  zEPS EstimatezReported EPSfloat64g        zTimezone short namer   )rR  rW  )rW  rS  rT  rU  )r	   rq   r   r.   r7   r=  rs   r  	DataFrameemptyr   ra  rm   rf  r  rZ   rr  rd   r  r  astypenpnanrc  ri  rd  r4   )rF   rH  rx   rj   rk   r7  rk  r  rowrV  r  r   
_exceptionrs  rd   columns_to_updates                   rL   "_get_earnings_dates_using_screenerz-TickerBase._get_earnings_dates_using_screener  s    $$& 78!T2#'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   I&c                 >    | j                         j                         S rQ   )rR   get_history_metadatar[   s    rL   r  zTickerBase.get_history_metadata  s    ,,.CCEErN   c                 |    | j                   s%t        | j                  | j                        | _         | j                   S rQ   )rB   r   r7   r.   r[   s    rL   get_funds_datazTickerBase.get_funds_data  s.    (T[[ADrN   c                     || _         t        |      | _        | j                  j                  | j                         | j                  j                  | j                          y )N)verbose)rD   r   rE   	subscriber.   listen)rF   message_handlerr  s      rL   livezTickerBase.live!  sB     /G,$++&t,,-rN   rQ   )F)Fyearly)FFr  )max)NN)rW   r4  )   r   )r  )NT)?__name__
__module____qualname__rM   r	   log_indent_decoratorr  r  rS   rR   rZ   ra   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   ra  r.  listrD  rJ  rG  r  r  r   r  r   rN   rL   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  .rN   r   )5
__future__r   rs   r  typingr   r   urllib.parser   r(  numpyr  pandasr  	curl_cffir   r$   r	   r
   constr   ry   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   rb   r   r  rN   rL   <module>r     se   , &  " +     '   P P  ' / % + * % 7 7    p. p.rN   