
    Wg`                         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
 d dlZd dlZd dlZddlmZ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 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 a) G d d      Z*y)    )print_functionN)OptionalUnion)quote   )utilscache)YfData)YFEarningsDateMissingYFRateLimitError)Analysis)Fundamentals)Holders)QuoteFastInfo)PriceHistory)	FundsData)
_BASE_URL_
_ROOT_URL__QUERY1_URL_c                      e Zd Zd1dZej
                  dej                  fd       Zd Z	d Z
ej
                  d        Zd2dZd2d	Zd2d
Zd3defdZd3defdZd2dZd2dZd2dZd2dZd2dZd2dZd3defdZd3dZed        Zd2dZd3defdZd2dZd2dZd2dZ d2dZ!d2dZ"d2dZ#d4dZ$d5dZ%d5d Z&d5d!Z'd5d"Z(d5d#Z)d5de*ej                  ef   fd$Z+d5d%Z,d6dejZ                  fd&Z.d6dejZ                  fd'Z/d6dejZ                  fd(Z0d6dejZ                  fd)Z1d2de*ej                  ef   fd*Z2ej
                  d7d+       Z3d3de4e5   fd,Z6d8de7fd-Z8ej
                  d9de4ej                     fd.       Z9d3defd/Z:d3de4e;   fd0Z<y):
TickerBaseNc                    |j                         | _        || _        || _        d | _        d | _        g | _        d | _        i | _        d | _	        d | _
        t        j                  | j                        r&t        j                  | j                  d |      | _        t        |      | _        d | _        t#        | j                  | j                        | _        t'        | j                  | j                        | _        t+        | j                  | j                        | _        t/        | j                  | j                        | _        d | _        d | _        y )N)session)uppertickerproxyr   _tz_isin_news_shares_earnings_dates	_earnings_financialsr   is_isinget_ticker_by_isinr
   _data_price_historyr   	_analysisr   _holdersr   _quoter   _fundamentals_funds_data
_fast_info)selfr   r   r   s       @/var/www/html/venv/lib/python3.12/site-packages/yfinance/base.py__init__zTickerBase.__init__1   s    lln


! ==%224;;gNDK#G4
 #!$**dkk:

DKK8DJJ4)$**dkkB    returnc                 B     | j                         j                  |i |S N)_lazy_load_price_historyhistory)r/   argskwargss      r0   r7   zTickerBase.historyP   s#    6t,,.66GGGr2   c                     | j                   At        | j                  | j                  | j	                  | j
                  d            | _         | j                   S )N
   )timeout)r(   r   r'   r   _get_ticker_tzr   r/   s    r0   r6   z#TickerBase._lazy_load_price_historyV   sK    &".tzz4;;H[H[\`\f\fprH[Hs"tD"""r2   c                 0   |xs | j                   }| 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 )N   r   )exchangeTimezoneNametimeZoneFullName)r   r   r	   get_tz_cachelookupr   r   is_valid_timezonestore_fetch_ticker_tz_tz_info_fetch_ctrinfo)r/   r   r<   ctzks         r0   r=   zTickerBase._get_ticker_tz[   s    #8888O XXdkk"e--b1GGDKK&B:&&ug6Bz &) '!+&I "		>!%1B!" &&r*R(	r2   c                 
   |xs | j                   }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        $ rr}|j                  d| j                   d|        |j                  d       |j                  d       |j                  d|        |j                  d       Y d }~y d }~ww xY w# t        $ r  t        $ r+}	|j                  d| j                   d|	        Y d }	~	y d }	~	ww xY w)N1d)rangeintervalz/v8/finance/chart/)urlparamsr   r<   charterrorz$Got error from yahoo api for ticker z	, Error: resultr   metarA   z/Could not get exchangeTimezoneName for ticker 'z
' reason: zGot response: z------------- zFailed to get ticker ')r   r   get_yf_loggerr   r   r'   	cache_getjsongetdebug	ExceptionrT   r   )
r/   r   r<   loggerrR   rQ   datarT   erres
             r0   rG   zTickerBase._fetch_ticker_tz}   s    #$$&T2 .t{{m<	2::''CeU\']D99;D HHWb)--gt<ECDKK=PYZ_Y`ab 2=215f=>TUU  2LL#RSWS^S^R__ijmin!opLL!12LL1LL1TF,LL112   	 	LL1$++jLM	s1    /E 6C 	EA(D==EF!E==Fc                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )z~
        Returns a DataFrame with the recommendations
        Columns: period  strongBuy  buy  hold  sell  strongSell
        )r   r+   recommendationsto_dictr/   r   as_dictr_   s       r0   get_recommendationszTickerBase.get_recommendations   s<    
 "/TZZ{{**<<>!r2   c                 (    | j                  ||      S )N)r   rf   )rg   )r/   r   rf   s      r0   get_recommendations_summaryz&TickerBase.get_recommendations_summary   s    ''eW'EEr2   c                     |xs | j                   | j                  _         | 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   r+   upgrades_downgradesrd   re   s       r0   get_upgrades_downgradesz"TickerBase.get_upgrades_downgrades   s<     "/TZZ{{..<<>!r2   c                 l    |xs | j                   | j                  _         | j                  j                  S r5   )r   r+   calendarr/   r   s     r0   get_calendarzTickerBase.get_calendar   s'    !/TZZ{{###r2   c                 l    |xs | j                   | j                  _         | j                  j                  S r5   )r   r+   sec_filingsro   s     r0   get_sec_filingszTickerBase.get_sec_filings   s'    !/TZZ{{&&&r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S r5   )r   r*   majorrd   re   s       r0   get_major_holderszTickerBase.get_major_holders   s:    #1tzz}}""<<>!r2   c                     |xs | j                   | j                  _         | j                  j                  }||r|j                         S |S y r5   )r   r*   institutionalrd   re   s       r0   get_institutional_holdersz$TickerBase.get_institutional_holders   sE    #1tzz}}**||~%K r2   c                     |xs | j                   | j                  _         | j                  j                  }||r|j                         S |S y r5   )r   r*   
mutualfundrd   re   s       r0   get_mutualfund_holdersz!TickerBase.get_mutualfund_holders   sE    #1tzz}}''||~%K r2   c                     |xs | j                   | j                  _         | j                  j                  }||r|j                         S |S y r5   )r   r*   insider_purchasesrd   re   s       r0   get_insider_purchasesz TickerBase.get_insider_purchases   sE    #1tzz}}..||~%K r2   c                     |xs | j                   | j                  _         | j                  j                  }||r|j                         S |S y r5   )r   r*   insider_transactionsrd   re   s       r0   get_insider_transactionsz#TickerBase.get_insider_transactions   sE    #1tzz}}11||~%K r2   c                     |xs | j                   | j                  _         | j                  j                  }||r|j                         S |S y r5   )r   r*   insider_rosterrd   re   s       r0   get_insider_roster_holdersz%TickerBase.get_insider_roster_holders   sE    #1tzz}}++||~%K r2   c                 p    |xs | j                   | j                  _         | j                  j                  }|S r5   )r   r+   rI   r/   r   r_   s      r0   get_infozTickerBase.get_info   s+    !/TZZ{{r2   c                 V    | j                   t        | |      | _         | j                   S )N)r   )r.   r   ro   s     r0   get_fast_infozTickerBase.get_fast_info   s$    ??"&t59DOr2   c                 N    t        j                  dt               | j                  S )Nz]'Ticker.basic_info' is deprecated and will be removed in future, Switch to 'Ticker.fast_info')warningswarnDeprecationWarning	fast_infor>   s    r0   
basic_infozTickerBase.basic_info   s#    u  xJ  	K~~r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S r5   )r   r+   sustainabilityrd   re   s       r0   get_sustainabilityzTickerBase.get_sustainability  s:    !/TZZ{{))<<>!r2   c                 p    |xs | j                   | j                  _         | j                  j                  }|S )z:
        Keys:   current  low  high  mean  median
        )r   r)   analyst_price_targetsr   s      r0   get_analyst_price_targetsz$TickerBase.get_analyst_price_targets  s-      %2

~~33r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )zw
        Index:      0q  +1q  0y  +1y
        Columns:    numberOfAnalysts  avg  low  high  yearAgoEps  growth
        )r   r)   earnings_estimaterd   re   s       r0   get_earnings_estimatez TickerBase.get_earnings_estimate  s;    
  %2

~~//!(t||~2d2r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )z{
        Index:      0q  +1q  0y  +1y
        Columns:    numberOfAnalysts  avg  low  high  yearAgoRevenue  growth
        )r   r)   revenue_estimaterd   re   s       r0   get_revenue_estimatezTickerBase.get_revenue_estimate  ;    
  %2

~~..!(t||~2d2r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )zy
        Index:      pd.DatetimeIndex
        Columns:    epsEstimate  epsActual  epsDifference  surprisePercent
        )r   r)   earnings_historyrd   re   s       r0   get_earnings_historyzTickerBase.get_earnings_history"  r   r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )zu
        Index:      0q  +1q  0y  +1y
        Columns:    current  7daysAgo  30daysAgo  60daysAgo  90daysAgo
        )r   r)   	eps_trendrd   re   s       r0   get_eps_trendzTickerBase.get_eps_trend+  s;    
  %2

~~''!(t||~2d2r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )z{
        Index:      0q  +1q  0y  +1y
        Columns:    upLast7days  upLast30days  downLast7days  downLast30days
        )r   r)   eps_revisionsrd   re   s       r0   get_eps_revisionszTickerBase.get_eps_revisions4  s;    
  %2

~~++!(t||~2d2r2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S )zi
        Index:      0q  +1q  0y  +1y +5y -5y
        Columns:    stock  industry  sector  index
        )r   r)   growth_estimatesrd   re   s       r0   get_growth_estimateszTickerBase.get_growth_estimates=  r   r2   c                    |xs | j                   | j                  _         | j                  j                  y| j                  j                  |   }|r4|j                         }d| j                  vrdn| j                  d   |d<   |S |S )a^  
        :Parameters:
            as_dict: bool
                Return table as Python dict
                Default is False
            freq: str
                "yearly" or "quarterly" or "trailing"
                Default is "yearly"
            proxy: str
                Optional. Proxy server URL scheme
                Default is None
        NfinancialCurrencyUSD)r   r,   earningsrd   r#   )r/   r   rf   freqr_   	dict_datas         r0   get_earningszTickerBase.get_earningsF  s     $)#6DJJ &&.!!**40I6IQUQ_Q_6_Ueieses#f%I)*r2   c                 ,   |xs | j                   | j                  _         | j                  j                  j                  ||      }|r9|j	                         }t        j                  |j                  dg d      |_        |r|j                         S |S )a  
        :Parameters:
            as_dict: bool
                Return table as Python dict
                Default is False
            pretty: bool
                Format row names nicely for readability
                Default is False
            freq: str
                "yearly" or "quarterly" or "trailing"
                Default is "yearly"
            proxy: str
                Optional. Proxy server URL scheme
                Default is None
        r   r   rW   )EBITEBITDAEPSNIsepacronyms)	r   r,   
financialsget_income_time_seriescopyr   camel2titleindexrd   r/   r   rf   prettyr   r_   s         r0   get_income_stmtzTickerBase.get_income_stmt^  sz      $)#6DJJ !!,,CCUZC[99;D**4::3IhiDJ<<>!r2   c                 *    | j                  ||||      S r5   r   r/   r   rf   r   r   s        r0   get_incomestmtzTickerBase.get_incomestmty      ##E7FDAAr2   c                 *    | j                  ||||      S r5   r   r   s        r0   get_financialszTickerBase.get_financials|  r   r2   c                 *   |xs | j                   | j                  _         | j                  j                  j                  ||      }|r8|j	                         }t        j                  |j                  ddg      |_        |r|j                         S |S a  
        :Parameters:
            as_dict: bool
                Return table as Python dict
                Default is False
            pretty: bool
                Format row names nicely for readability
                Default is False
            freq: str
                "yearly" or "quarterly"
                Default is "yearly"
            proxy: str
                Optional. Proxy server URL scheme
                Default is None
        r   rW   PPEr   )	r   r,   r   get_balance_sheet_time_seriesr   r   r   r   rd   r   s         r0   get_balance_sheetzTickerBase.get_balance_sheet  s|      $)#6DJJ !!,,JJPT\aJb99;D**4::3%QDJ<<>!r2   c                 *    | j                  ||||      S r5   )r   r   s        r0   get_balancesheetzTickerBase.get_balancesheet  s    %%eWfdCCr2   c                 *   |xs | j                   | j                  _         | j                  j                  j                  ||      }|r8|j	                         }t        j                  |j                  ddg      |_        |r|j                         S |S r   )	r   r,   r   get_cash_flow_time_seriesr   r   r   r   rd   r   s         r0   get_cash_flowzTickerBase.get_cash_flow  s{      $)#6DJJ !!,,FFDX]F^99;D**4::3%QDJ<<>!r2   c                 *    | j                  ||||      S r5   )r   r   s        r0   get_cashflowzTickerBase.get_cashflow  s    !!%&$??r2   c                 D    | j                         j                  ||      S N)periodr   )r6   get_dividendsr/   r   r   s      r0   r   zTickerBase.get_dividends  s"    ,,.<<FRW<XXr2   c                 D    | j                         j                  ||      S r   )r6   get_capital_gainsr   s      r0   r   zTickerBase.get_capital_gains  s"    ,,.@@V[@\\r2   c                 D    | j                         j                  ||      S r   )r6   
get_splitsr   s      r0   r   zTickerBase.get_splits  s!    ,,.99u9UUr2   c                 D    | j                         j                  ||      S r   )r6   get_actionsr   s      r0   r   zTickerBase.get_actions  s"    ,,.::&PU:VVr2   c                     |xs | j                   | j                  _         | j                  j                  }|r|j                         S |S r5   )r   r,   sharesrd   re   s       r0   
get_shareszTickerBase.get_shares  s>    #(#6DJJ !!((<<>!r2   c                 8   t        j                         }| j                  |d      }t        j                  j                         j                  |      }|St        j                  ||      }t        j                  j                  |      j                  d      j                  |      }|St        j                  ||      }t        j                  j                  |      j                  d      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(  }|r|j                  | j                   d       y |d   d   }d|d   vry 	 t        j4                  |d   d   t        j6                  |d   d   d            }|j:                  j                  |      |_        |j=                         }|S # t(        j*                  t,        j.                  j0                  f$ r! |j                  | j                   d       Y y w xY w# t2        $ r d}Y w xY w# t8        $ r*}|j                  | j                   d|        Y d }~y d }~ww xY w)Nr;   r   r<   UTCi$  )dayszStart date must be before endDzRhttps://query2.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/z?symbol=z	&period1=z	&period2=rQ   r   z*: Yahoo web request for share count failedfinancerT   codezBad RequestF
timeseriesrU   
shares_outr   	timestamps)unit)r   z%: Failed to parse shares count data: )r   rX   r=   pd	Timestamputcnow
tz_convert_parse_user_dtfromtimestamptz_localize	TimedeltarT   floorceilr   intr   r'   rY   rZ   _jsonJSONDecodeErrorrequests
exceptionsRequestExceptionKeyErrorSeriesto_datetimer]   r   
sort_index)r/   startendr   r^   rK   dt_nowstart_tsend_tsts_url_base
shares_url	json_datafailshares_datadfra   s                   r0   get_shares_fullzTickerBase.get_shares_full  s   $$&   ub 9$$&11"5++E26HLL..x8DDUKVVWYZE?))#r2F,,,,V4@@GRRSUVC;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
	

,,5,II!(I	Y'08MID LLDKK=(RST-h7{1~-	;q>,7r~~kZ[n]hNips?tuB
 88''+]]_	- %%x':':'K'KL 	LLDKK=(RST	
  	D	  	LLDKK=(MaSQR	s=   ,-J K 8K& AKKK#"K#&	L/ LLc                    | j                   | j                   S | j                  j                         }d|v sd|v rd| _         | j                   S |}|xs | j                  | j                  _        | 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   )r   r   r   r   r+   rI   	urlencoder'   rY   textlowersplit)r/   r   r   qrQ   r_   
search_strs          r0   get_isinzTickerBase.get_isin  sc   ::!::""$&=C6MDJ::!/TZZ;;#$++***  -Aghqrshtguvzz##5#9>>]
T!wwyDJJL(!
T)!$DJ::% 
zz!ZZ
+A.44S9!<BB3GJ
zzr2   c           	         | 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# |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   )bodyr   zWill be right backz~*** YAHOO! FINANCE IS CURRENTLY DOWN! ***
Our engineers are working quickly to resolve the issue. Thank you for your patience.zC: Failed to retrieve the news and received faulty response instead.r_   tickerStreamstreamad)r    r   rX   r[   r  
ValueErrorjoinkeysr   r   r'   postr  RuntimeErrorrZ   r   r   rT   )r/   counttabr   r^   tab_queryrefs	query_refrQ   payloadr_   r"  articles               r0   get_newszTickerBase.get_news(  s   ::::$$&  ,
 "%%ciik2	1#6FtyyQ^QcQcQeGfFghii.yk9LM %kk]
 zzs></499<  I J J	99;D
 xx#'';??"M-1O'T29NgO
zz $$ 	LLDKK=(klmD	 Ps   E  F	8F	3FFc                    t        j                         }t        |d      }| j                  r|| j                  v r| j                  |   S t         d}ddd}|ddd| j
                  gd	dd
dgd	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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.        j0                        ||<   |j3                  dd#gd$d%&       |j5                  dd%'       |j7                  d(d)id%*       || j                  |<   |S c c}
w )+a  
        Get earning dates (future and historic)
        
        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.
            proxy: requests proxy to use.
        
        Returns:
            pd.DataFrame
        d   z/v1/finance/visualizationzen-USUS)langregionandeqr   )operatoroperands	eventtype2startdatetimeDESCr   )r@  timeZoneShortNameepsestimate	epsactualepssurprisepct)sizequery	sortFieldsortTypeentityIdTypeincludeFields)rR   r%  r   r   rU   r   	documentscolumnslabelrows)rM  z: NzEvent Start DatezEarnings Date   r   )Surprise (%)zEPS EstimatezReported EPSfloat64g        zTimezone short namer   T)axisinplace)rT  rQ  zSurprise(%))rM  rT  )r   rX   minr"   r   r   r'   r,  rZ   r   	DataFrameemptyr   strrT   r  r=   dtrK   r   r   astypereplacenpnandrop	set_indexrename)r/   limitr   r^   clamped_limitrQ   rR   r%  responser  rowrM  rO  r  
_exceptionerr_msgrK   columns_to_updates                     r0   get_earnings_dateszTickerBase.get_earnings_datesQ  s    $$&E3MT5I5I$I''66 78!T2!!!%Hdkk3JK!%K3EF )&q
 ::??3vD?NMMO	 ,5Y+?+I!+L[+YZ[+\]f+ghC3w<hh#H-a0=a@H\\$088.t{{;J*oGLLDKK=7)45 !nnR0B-CD?  ub 9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.0]+	9 is   Ic                 @    | j                         j                  |      S r5   )r6   get_history_metadataro   s     r0   rj  zTickerBase.get_history_metadata  s    ,,.CCEJJr2   c                 |    | j                   s%t        | j                  | j                        | _         | j                   S r5   )r-   r   r'   r   ro   s     r0   get_funds_datazTickerBase.get_funds_data  s.    (T[[ADr2   )NN)NFr5   )NFyearly)NFFrm  )Nmax)NNN)r;   r"  N)   N)=__name__
__module____qualname__r1   r   log_indent_decoratorr   rV  r7   r6   r=   rG   rg   ri   rl   dictrp   rs   rv   ry   r|   r   r   r   r   r   propertyr   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   rX  r  listr4  rh  rj  r   rl   r2   r0   r   r   0   s   > H",, H  H
#
 D !  !F	F
$$ $'T 'd 

  t 33333306BB6DW\]_]i]iko]oWp 6@Y Y]RYY ]Vbii VWryy WuR\\4=O7P  2  2h#hsm #J'D 'R D(2<<:P D  DLK$ K HY,?  r2   r   )+
__future__r   rZ   r   r   typingr   r   urllib.parser   r  numpyr\  pandasr   r    r   r	   r_   r
   r   r   r   scrapers.analysisr   scrapers.fundamentalsr   scrapers.holdersr   scrapers.quoter   r   scrapers.historyr   scrapers.fundsr   constr   r   r   rH   r   rw  r2   r0   <module>r     sT   , &   " +      ? ' / % + * % 7 7  o	  o	 r2   