
    Ejp                     <   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          Z4dS )    )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                   *   e Zd Zd<dZej        dej        fd            Zd Z	d Z
ej        d             Zd=d	Zd=d
Zd=dZdefdZdefdZd=dZd=dZd=dZd=dZd=dZd=dZdefdZd Zd Zd=dZdefdZd=dZd=dZd=dZd=dZ d=dZ!d=dZ"d>d Z#d?d!Z$d?d"Z%d?d#Z&d?d$Z'd?d%Z(d?de)ej        ef         fd&Z*d?d'Z+d@dej,        fd)Z-d@dej,        fd*Z.d@dej,        fd+Z/d@dej,        fd,Z0d=de)ej        ef         fd-Z1ej        dAd.            Z2de3e4         fd/Z5dBde6fd2Z7dCde3ej                 fd5Z8ej        dCde3ej                 fd6            Z9ej        dDde3ej                 fd7            Z:defd8Z;de3e<         fd9Z=dEd;Z>dS )F
TickerBaseNc                 6   t          |t                    rt          |          dk    rt          d          |\  }}|                    d          r
|dd         }|                                t          vrt          d| d          t          |                                         }|dk    r| d| }n|}|                                | _        |pt          j	        d	
          | _
        d| _        d| _        g | _        d| _        i | _        d| _        d| _        | j        dk    rt          d          t%          |          | _        t)          j        | j                  r| j        }t-          j                    }|                    |          | _        | j        st)          j        |          | _        | j        dk    rt          d|           | j        r|                    || j                   d| _        t9          | j        | j                  | _        t=          | j        | j                  | _        tA          | j        | j                  | _!        tE          | j        | j                  | _#        d| _$        d| _%        d| _&        d| _'        dS )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           I/var/www/html/bolsaweb/venv/lib/python3.11/site-packages/yfinance/base.py__init__zTickerBase.__init__7   ss    fe$$ 	%6{{a !JKKK$*!K""3'' (#ABB<~~';;; !Bx!B!B!BCCC&x~~'7'78Cbyy'//#//$llnnH("2x"H"H"H

! ;"0111#G444
 =%% 		+;D$&&A((4..DK; =#6t<<{b   !?!?!?@@@{ +dk*** #!$*dk::
DK88DJ44)$*dkBB $    returnc                 @     |                                  j        |i |S N)_lazy_load_price_historyhistory)rF   argskwargss      rL   rS   zTickerBase.history   s&    6t,,..6GGGGrN   c                     | j         4t          | j        | j        |                     d                    | _         | j         S )N
   timeout)r=   r   r7   r.   _get_ticker_tzrF   s    rL   rR   z#TickerBase._lazy_load_price_history   s>    &".tz4;H[H[dfH[HgHg"h"hD""rN   c                    | j         | j         S t          j                    }|                    | j                  }|r1t          j        |          s|                    | j        d            d }|{|                     |          }|2t          dk     r't          dz  a	dD ]}|| j
        v r| j
        |         } nt          j        |          r|                    | 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   88O  XXdk"" 	e-b11 	GGDK&&&B:&&w//Bz &)) '!+&I " "	>>!%1B!E * &r** R((((	rN   c                    t          j                    }ddd}t           d| j         }	 | j                            |||          }|                                }|                    di                               dd           }|r"|                    d| j         d|            n	 |d         d	         d
         d         d         S # t          $ r}t          j        j        s |                    d| j         d|            |                    d           |                    d           |                    d|            |                    d           Y d }~n\d }~ww xY w# t          $ r  t          $ r=}t          j        j        s |                    d| j         d|            Y d }~d S d }~ww xY wd S )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2 <<t{<<	2:''C'PPD99;;D HHWb))--gt<<E 2aDKaaZ_aabbbb	2=215f=>TUU  2 2 2#>9 LL!oSWS^!o!ojm!o!opppLL!1222LL111LLT,,,LL111111112!   	 	 	 	 	 	>1 LLL$+LLLLMMM44444		* ts0   1E+ +C 
E(B	E##E(+F<?2F77F<Fc                 J    | j         j        }|r|                                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                 .    |                      |          S )N)r   )r   )rF   r   s     rL   get_recommendations_summaryz&TickerBase.get_recommendations_summary   s    '''888rN   c                 J    | j         j        }|r|                                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                 J    | j         j        }|r|                                S |S rQ   )r?   majorr~   r   s      rL   get_major_holderszTickerBase.get_major_holders   s'    }" 	"<<>>!rN   c                 R    | j         j        }||r|                                S |S d S rQ   )r?   institutionalr~   r   s      rL   get_institutional_holdersz$TickerBase.get_institutional_holders   s5    }* &||~~%K rN   c                 R    | j         j        }||r|                                S |S d S rQ   )r?   
mutualfundr~   r   s      rL   get_mutualfund_holdersz!TickerBase.get_mutualfund_holders   s5    }' &||~~%K rN   c                 R    | j         j        }||r|                                S |S d S rQ   )r?   insider_purchasesr~   r   s      rL   get_insider_purchasesz TickerBase.get_insider_purchases  s5    }. &||~~%K rN   c                 R    | j         j        }||r|                                S |S d S rQ   )r?   insider_transactionsr~   r   s      rL   get_insider_transactionsz#TickerBase.get_insider_transactions  s5    }1 &||~~%K rN   c                 R    | j         j        }||r|                                S |S d S rQ   )r?   insider_rosterr~   r   s      rL   get_insider_roster_holdersz%TickerBase.get_insider_roster_holders  s5    }+ &||~~%K rN   c                     | j         j        }|S rQ   )r@   rc   rF   ry   s     rL   get_infozTickerBase.get_info  s    {rN   c                 F    | j         t          |           | _         | j         S rQ   )rC   r   r[   s    rL   get_fast_infozTickerBase.get_fast_info  s    ?"&tnnDOrN   c                     | j         j        }|S rQ   )r@   valuation_measuresr   s     rL   get_valuation_measuresz!TickerBase.get_valuation_measures"  s    {-rN   c                 J    | j         j        }|r|                                S |S rQ   )r@   sustainabilityr~   r   s      rL   get_sustainabilityzTickerBase.get_sustainability&  s'    {) 	"<<>>!rN   c                     | 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rN   c                 J    | j         j        }|r|                                n|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%    
 ~/!(2t||~~~d2rN   c                 J    | j         j        }|r|                                n|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;  %    
 ~.!(2t||~~~d2rN   c                 J    | j         j        }|r|                                n|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                 J    | j         j        }|r|                                n|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%     ~'!(2t||~~~d2rN   c                 J    | j         j        }|r|                                n|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%     ~+!(2t||~~~d2rN   c                 J    | j         j        }|r|                                n|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%     ~.!(2t||~~~d2rN   yearlyc                     | j         j        dS | j         j        |         }|r1|                                }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  so     &.4!*40 	I6IQUQ_6_6_UUeies#f%I)*rN   c                     | j         j                            |          }|r7|                                }t	          j        |j        dg d          |_        |r|                                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{  ss     !,CCCNN 	j99;;D*4:3IhIhIhiiiDJ 	"<<>>!rN   c                 0    |                      |||          S rQ   r   rF   r   r   r   s       rL   get_incomestmtzTickerBase.get_incomestmt      ##GVT:::rN   c                 0    |                      |||          S rQ   r   r   s       rL   get_financialszTickerBase.get_financials  r   rN   c                     | j         j                            |          }|r6|                                }t	          j        |j        ddg          |_        |r|                                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  so     !,JJPTJUU 	R99;;D*4:3%QQQDJ 	"<<>>!rN   c                 0    |                      |||          S rQ   )r   r   s       rL   get_balancesheetzTickerBase.get_balancesheet  s    %%gvt<<<rN   c                     | j         j                            |          }|r6|                                }t	          j        |j        ddg          |_        |r|                                S |S r   )rA   r   get_cash_flow_time_seriesr   r	   r   r   r~   r   s        rL   get_cash_flowzTickerBase.get_cash_flow  sn     !,FFDFQQ 	R99;;D*4:3%QQQDJ 	"<<>>!rN   c                 0    |                      |||          S rQ   )r   r   s       rL   get_cashflowzTickerBase.get_cashflow  s    !!'64888rN   maxc                 R    |                                                      |          S N)period)rR   get_dividendsrF   r   s     rL   r   zTickerBase.get_dividends  s%    ,,..<<F<KKKrN   c                 R    |                                                      |          S r   )rR   get_capital_gainsr   s     rL   r   zTickerBase.get_capital_gains  s%    ,,..@@@OOOrN   c                 R    |                                                      |          S r   )rR   
get_splitsr   s     rL   r   zTickerBase.get_splits  s%    ,,..999HHHrN   c                 R    |                                                      |          S r   )rR   get_actionsr   s     rL   r   zTickerBase.get_actions  s%    ,,..::&:IIIrN   c                 J    | j         j        }|r|                                S |S rQ   )rA   sharesr~   r   s      rL   
get_shareszTickerBase.get_shares  s(    !( 	"<<>>!rN   c                 R   t          j                    }|                     d          }t          j                            d                              |          }|t          j        ||          }|t          j        ||          }||}||t          j        d          z
  }||k    r|	                    d           d S |
                    d          }|                    d          }d| j         d	| j         }| d
t          |                                           dt          |                                           }	 | j                            |          }|                                }nV# t$          j        t(          j        j        f$ r3 t.          j        j        s |	                    | j         d           Y d S w xY w	 |d         d         d         dk    }	n# t4          $ r d}	Y nw xY w|	rOt.          j        j        st(          j                            d          |	                    | j         d           d S |d         d         }
d|
d         vrd S 	 t          j        |
d         d         t          j        |
d         d         d                    }nI# t<          $ r<}t.          j        j        s |	                    | j         d|            Y d }~d S d }~ww xY w|j                             |          |_        |!                                }|S )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  sa   $&&    ,,!!%((33B77(33E?&sB//C;C=",C0000EC<<LL89994C  hhsmm Nkokv  N  N  AE  AL  N  N#eec%//2C2C.D.DeesSVS`S`SbSbOcOcee
	
,,,<<I!((II%x':'KL 	 	 	>1 LLDKSSSTTT44		
	Y'08MIDD 	 	 	DDD	 	>1 p)334noooLLDKSSSTTT4-h7{1~--4	;q>,7r~kZ[n]hNips?t?t?tuuuBB 	 	 	>1 LLDKQQaQQRRR44444		 8''++]]__	s>   
/E: :AGGG* *G98G9(AJ+ +
K151K,,K1c                    | j         | j         S | j                                        }d|v sd|v rd| _         | j         S |}| j        j        d S d| j        j        v r| j        j        d         }dt          |           }| j                            |          j        }d| d}||vrK|	                                |	                                v rd}||vrd| _         | j         S nd| _         | j         S |
                    |          d	         
                    d          d
         
                    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  sY   :!:""$$&==C6MMDJ:;#4$+*** -Avhqrshthtvvz###,,1"]]]
T!!wwyyDJJLL((!
T))!$DJ:% * !
z!ZZ
++A.44S99!<BB3GGJ
zrN   rW   newsc           	         | j         r| j         S t          j                    }dddd}|                    |                                          }|s:t          d| dd                    |                                                     t           d| d	}d
|| j	        gdi}| j
                            ||          }|	d|j        v rt          d          	 |                                }nF# t          j        $ r4 t"          j        j        s |                    | j	         d           i }Y nw xY w|                    di                               di                               dg           }	d |	D             | _         | j         S )z7Allowed options for tab: "news", "all", "press releasesnewsAll
latestNewspressRelease)allr1  zpress releaseszInvalid tab name 'z'. Choose from: z, z/xhr/ncp?queryRef=z&serviceKey=ncp_finserviceConfig)snippetCountr  )bodyNzWill be right backz)*** YAHOO! FINANCE IS CURRENTLY DOWN! ***zC: Failed to retrieve the news and received faulty response instead.ry   tickerStreamstreamc                 >    g | ]}|                     d g           |S )ad)rt   ).0articles     rL   
<listcomp>z'TickerBase.get_news.<locals>.<listcomp>e  s+    OOO'T29N9NOgOOOrN   )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   r1  s
             rL   get_newszTickerBase.get_news>  s   : 	:$&&  ,
 
 "%%ciikk22	 	jh#hhtyyQ^QcQcQeQeGfGfhhiiiMMyMMM %k] 
 zs11</49<<!"MNNN	99;;DD$ 	 	 	>1 LLDKlllmmmDDD		 xx##'';;??"MMOOTOOO
zs   C1 1A D43D4   r   c                     |dk    rt          d          | j        r|| j        v r| j        |         S |                     ||          }|| 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  sg    3;;6777 	/ET-A$A$A'..225&AA&(U#	rN   c                 t   |dk    r	|dk    rd}n-|dk    r	|dk    rd}n|dk    r	|dk    rd}nt          d          d                    | j        ||          }| j                            |          }t          |j        d          }|                    d          }|rbt          |          }t          |          }	t          j        |	d	g
          d         }
|
                    ddgd          }
|
                    ddid           |
                    d          }
|
d         j                            dd          |
d<   |
d         j                            dd          |
d<   |
d         j                            ddd          }|d         }|d         }t          j        |d          |
d<   t          j        d t'          |
d         |          D                       |
d<   |
                    d          }
n6d}t+          j                    }|                    | j         d|            dS |
S ) 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   rL  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)formatc                 >    g | ]\  }}|                     |          S  )r  )r>  dtrd   s      rL   r@  z?TickerBase._get_earnings_dates_using_scrape.<locals>.<listcomp>  s(    ,l,l,lFBR^^B-?-?,l,l,lrN   z/No earnings dates found, symbol may be delisted: N)r+   rd  r.   r7   rr   r   r+  findstrr   r  	read_htmldroprenamedropnareplacersplitr  r  zip	set_indexr	   rq   rm   )rF   rN  rO  sizerj   responsesouprT  
table_htmlhtml_stringior"  dt_partsdtstzserr_msgrx   s                   rL   rM  z+TickerBase._get_earnings_dates_using_scrapes  sc   @ 199"DDRZZERKKDDRZZESLLDD6777 X^^K
 
 :'',, X]M::		'"" "	UJ %Z00M mu===a@B (I.Q77B II~}=tILLL/22B #%_"5"9"A"A%I["\"\B"$_"5"9"A"A%I["\"\B/*.55cQt5LLH1+C1+C"$.=Q"R"R"RB"$),l,lcRTUdRegjNkNk,l,l,l"m"mBo..BB HG(**FLLDK447445554	rN   c                 J   t          j                    }t           d}ddd}|dd| j        gddd	d
g dd}| j                            |||          }|                                }d |d         d         d         d         d         d         D             }|d         d         d         d         d         d         }	t          j        |	|          }
|
j	        rDt          | j                  }t          |          }|                    | j         d|            dS |
d                             ddd          |
d<   |
d                             ddd          |
d<   |
d                             dd d          |
d<   t          j        |
d!                   |
d"<   |                     d#$          }|
d"         j        j        $|
d"         j                            |          |
d"<   n#|
d"         j                            |          |
d"<   g d%}|
|                             d&                              d't*          j                  |
|<   |
                    d!d(gd)d*           |
                    d"d+           |
                    d,d-id.           |
| j        |<   |
S )/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)rs  query	sortFieldsortTypeentityIdTypeincludeFields)rk   r9  c                     g | ]
}|d          S )labelrf  )r>  rows     rL   r@  zATickerBase._get_earnings_dates_using_screener.<locals>.<listcomp>  s    hhhC3w<hhhrN   r   rn   r   	documentsr\  rows)r\  rh  Nz
Event Typez^1$CallT)regexz^2$Earningsz^11$MeetingzEvent Start Dater^     rX   )rY  zEPS EstimatezReported EPSfloat64g        zTimezone short namer   )rX  r]  )r]  rY  rZ  r[  )r	   rq   r   r.   r7   rC  rs   r  	DataFrameemptyr   rj  rm   ro  r  rZ   rg  rd   r  r
  astypenpnanrl  rr  rm  r4   )rF   rN  rx   rj   rk   r9  rt  r  r\  r  r"  
_exceptionr{  rd   columns_to_updates                  rL   "_get_earnings_dates_using_screenerz-TickerBase._get_earnings_dates_using_screener  s    $&& 888!T22#'h5LNN(&~~~
 
 :??3vD?AAMMOO	 ih9Y+?+I!+L[+YZ[+\]f+ghhh#H-a0=a@H\$0008 	.t{;;J*ooGLLDK447445554 l+33E63NN<l+33E:T3RR<l+33FIT3RR< !nR0B-CDD?   ,,o!$,"$_"5"8"D"DR"H"HB"$_"5"8"C"CB"G"GB MLL "#4 5 < <Y G G O OPSUWU[ \ \ 	#%:;!TRRR
_d333
		>=94	HHH&(U#	rN   c                 N    |                                                                  S rQ   )rR   get_history_metadatar[   s    rL   r  zTickerBase.get_history_metadata  s     ,,..CCE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-     	B(T[AADrN   Tc                     || _         t          |          | _        | j                            | j                   | j                            | j                    d S )N)verbose)rD   r   rE   	subscriber.   listen)rF   message_handlerr  s      rL   livezTickerBase.live!  sQ     /G,,,$+&&&t,-----rN   rQ   )F)Fr   )FFr   )r   )NN)rW   r1  )rJ  r   )rJ  )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   rj  r0  listrI  rP  rM  r  r  r   r  r  rf  rN   rL   r   r   6   sN       F F F FP H", H H H  H
# # #
  B $ $  $L   9 9 9 9	 	 	 	$d $ $ $ $' ' ' ' '                  $      
     4    3 3 3 33 3 3 33 3 3 33 3 3 33 3 3 33 3 3 3   *   .; ; ; ;; ; ; ;   0= = = = 5QSQ]_cQcKd    09 9 9 9L LRY L L L LP P P P P PI I") I I I IJ J29 J J J J 5t1C+D     7 7 7  7r"(3- " " " "H( ( ( ( ( (T	 	HR\<R 	 	 	 	 \ \(SUS_J` \ \ \  \| C Chr|>T C C C  CJFd F F F 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   rf  rN   rL   <module>r     s  , & % % % % %     " " " " " " " " + + + + + +                       ' ' ' ' ' '             P P P P P P P P P P       ' ' ' ' ' ' / / / / / / % % % % % % + + + + + + + + * * * * * * % % % % % % 7 7 7 7 7 7 7 7 7 7              p. p. p. p. p. p. p. p. p. p.rN   