
    U>qjķ              
       f   d dl mZ d dlZd dlZd dlZd dlZd dlZd dl	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Zd dlZd dlZd dlmZ d dl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$ 	 d dl%m%Z% d Z( G d dejR                        Z* e	jV                         Z, G d d      Z-dLdZ.d Z/ G d dej`                        Z1da2da3 G d dejh                        Z5d Z6d Z7d Z8d Z9d  Z:d! Z;d" Z<d# Z=d$ Z>dLd%Z?d& Z@d' ZAd( ZBdMd)ZCd* ZDdNd+eeE   d,eEd-eeeE      d.eeE   fd/ZFd0 ZGej                  fd1ZId2 ZJd3 ZKd4 ZLd5 ZMd6 ZNd7 ZOd8 ZPd9 ZQd: ZRdOd;ZSd< ZTd= ZUd>eEd.eVfd?ZWdPdAZX G dB dC      ZYdDe'fdEZZdLd.eEfdFZ[dQdGe'dHeVdIeEd.eEfdJZ\d@dg fdGe'dHeVdIeEd.eEfdKZ]y# e&$ r  G d de'      Z%Y ;w xY w)R    )print_functionNwraps)
getmembers)FunctionType)ListOptional)is_float_dtype)relativedelta)UnknownTimeZoneError)const)YFException)YfConfig)
frozendictc                   @    e Zd ZdZdZd Zd Zd Zd ZeZ	eZ
eZeZeZy)r   z:Hashable, read-only ``dict`` used as an ``lru_cache`` key. c                 F    t        t        | j                                     S N)hash	frozensetitemsselfs    M/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/yfinance/utils.py__hash__zfrozendict.__hash__8   s    	$**,/00    c                 F    t        dt        |       j                   d      )N'z(' object doesn't support item assignment	TypeErrortype__name__r   argskwargss      r   __setitem__zfrozendict.__setitem__;   s"    aT
 3 344\]^^r   c                 F    t        dt        |       j                   d      )Nr   z&' object doesn't support item deletionr   r#   s      r   __delitem__zfrozendict.__delitem__>   s"    aT
 3 344Z[\\r   c                 F    t        dt        |       j                   d      )Nr   z' object is read-only)AttributeErrorr!   r"   r#   s      r   	_readonlyzfrozendict._readonlyA   s"     1T$Z%8%8$99N!OPPr   N)r"   
__module____qualname____doc__	__slots__r   r&   r(   r+   poppopitemclearupdate
setdefaultr   r   r   r   r   4   s<    H		1	_	]	Q 
r   r   c                     t        t        |             D ch c]  \  }}t        |t              r| }}}t	        |       D ci c]'  }|d   dk7  r||vrt        | |      r|t        | |      ) c}S c c}}w c c}w )Nr   _)r   r!   
isinstancer   dirhasattrgetattr)objnamevaluedisallowed_namess       r   
attributesr?   L   s     *49 5,ue\* 	, , .1XS%)7c>d*::wsD?Q 	gc4  S S,Ss   A3,A9c                       e Zd Zd Zy)IndentLoggerAdapterc                    t               j                  t        j                        r^d| j                  d   z  }t        |t              st        |      }dj                  |j                  d      D cg c]  }||z   	 c}      }||fS c c}w )N indent
)	get_yf_loggerisEnabledForloggingDEBUGextrar7   strjoinsplit)r   msgr%   ims        r   processzIndentLoggerAdapter.processY   sp    ?''6djj**Ac3'#h))CIIdO<qQU<=CF{ =s   3B
N)r"   r,   r-   rQ   r   r   r   rA   rA   X   s    r   rA   c                        e Zd ZddZd Zd Zy)IndentationContextc                     || _         y r   )	increment)r   rU   s     r   __init__zIndentationContext.__init__f   s	    "r   c                 R    t        t        dd      | j                  z   t        _        y NrD   r   )r:   _indentation_levelrU   rD   r   s    r   	__enter__zIndentationContext.__enter__i   s    $+,>!$Lt~~$]!r   c                 J    t         xj                  | j                  z  c_        y r   )rY   rD   rU   )r   exc_typeexc_valexc_tbs       r   __exit__zIndentationContext.__exit__l   s    !!T^^3!r   N)   )r"   r,   r-   rV   rZ   r_   r   r   r   rS   rS   e   s    #^4r   rS   c           	      b    t        t        j                  |       dt        t        dd      i      S rX   )rA   rH   	getLoggerr:   rY   )r<   s    r   get_indented_loggerrc   p   s+    w0067K]_gijCk8lmmr   c                 .     t                fd       }|S )Nc                      t        d      }|j                  dj                   d       t               5   | i |}d d d        |j                  dj                   d       S # 1 sw Y   *xY w)Nyfinancez	Entering z()zExiting )rc   debugr"   rS   )r$   r%   loggerresultfuncs       r   wrapperz%log_indent_decorator.<locals>.wrapperv   sp    $Z0yr23! 	+4*6*F	+ 	xb12		+ 	+s   	A((A1r   )rj   rk   s   ` r   log_indent_decoratorrl   u   s     
4[  Nr   c                   (     e Zd Z fdZ fdZ xZS )MultiLineFormatterc                     t         |   |       t        j                  d|      }|r t	        |j                  d            | _        y d| _        y )Nz%\(levelname\)-(\d+)sr`   r   )superrV   _researchintgrouplevel_length)r   fmtmatch	__class__s      r   rV   zMultiLineFormatter.__init__   s?    

3S938CA/ar   c                 `   t         |   |      }|j                  d      }|d   j                  d      d   }t        |      dk  r|S |d   g}| j                  dk(  rdt        |      z  nd| j                  z  dz  |j                  fd|dd  D               dj                  |      S )NrE   r   rC   r`   c              3   (   K   | ]	  }|z     y wr   r   ).0linepaddings     r   	<genexpr>z,MultiLineFormatter.format.<locals>.<genexpr>   s     BWt^Bs   )rp   formatrM   lenru   extendrL   )r   recordoriginallines	levelname	formattedr}   rx   s         @r   r   zMultiLineFormatter.format   s    7>&)t$!HNN3'*	u:?O q
I  A%I. 1 11sNGBab	BB99Y''r   )r"   r,   r-   rV   r   __classcell__)rx   s   @r   rn   rn      s    @( (r   rn   Fc                       e Zd Zd Zy)YFLogFormatterc                     |j                   }t        |d      r|j                   d| }t        |d      r|j                   d| }t        |d      r|j                   d| }||_         y)Nyf_cat: yf_interval	yf_symbolT)rN   r9   r   r   r   )r   r   rN   s      r   filterzYFLogFormatter.filter   su    jj68$]]O2cU+C6=)''(3%0C6;'%%&b.C
r   N)r"   r,   r-   r   r   r   r   r   r      s    	r   r   c                  V   t         r%t        j                  j                  st	                n*t        j                  j                  rt         s
t                t         rt        d      at        S t        2t        j                  d      at        j                  t                      t        S )Nrf   )yf_log_indentedr   rg   rH   _disable_debug_mode_enable_debug_moderc   	yf_loggerrb   	addFilterr   r   r   r   rF   rF      sr     x~~55			'
3	  
	%%j1	N,-r   c                  L    t        j                  dt               t                y )NzXenable_debug_mode() is replaced by: yf.config.debug.logging = True (or False to disable))warningswarnDeprecationWarningr   r   r   r   enable_debug_moder      s    MMl  oA  Br   c                  ~   t         st        j                  d      at        j	                  t        j
                         t        j                  t        t        j                        dk(  rFt        j                         } t        d      }| j                  |       t        j                  |        t               ada y y )Nrf   r   z%(levelname)-8s %(message)s)rv   T)r   rH   rb   r   setLevelrI   handlersr   StreamHandlerrn   setFormatter
addHandlerrc   )h	formatters     r   r   r      s     %%j1	7==)%Y-?-?)@A)E%%'A*/LMINN9%  #')	 r   c                      t         r=t        j                  d      at        j	                  t        j
                         d ada y y )Nrf   F)r   rH   rb   r   r   NOTSETr   r   r   r   r      s8     %%j1	7>>*		 r   c                 @    t        t        j                  d|             S )Nz ^([A-Z]{2})([A-Z0-9]{9})([0-9])$)boolrq   rw   )strings    r   is_isinr      s    		<fEFFr   c                 V   t        |       st        d      ddlm}  || d      }|j                  r|j                  d   ni }|j
                  }|j                  dd      |j                  dd      |j                  d	d      |j                  d
d      |j                  dd      d|dS )NzInvalid ISIN numberr`   )Search)querymax_resultsr   symbol 	shortnamelongname	quoteTypeexchDisp)r   r   r   r!   exchange)tickernews)r   
ValueErrorrr   r   quotesr   get)isinr   rr   r   r   s        r   get_all_by_isinr      s    DM.// $A.F "(V]]1BF;;D jj2.K4

:r2JJ{B/

:r2
 	 	r   c                 \    t        |       }|j                  di       j                  dd      S )Nr   r   r   r   r   r   datas     r   get_ticker_by_isinr      s*    4 D88Hb!%%h33r   c                 <    t        |       }|j                  di       S )Nr   r   r   s     r   get_info_by_isinr     s    4 D88Hb!!r   c                 <    t        |       }|j                  di       S )Nr   r   r   s     r   get_news_by_isinr     s    4 D88FBr   c           
         | g } t        j                  | t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  d      }d|j                  _        |S )NOpenHighLowClose	Adj CloseVolume)indexr   Date)_pd	DataFrame_npnanr   r<   )r   emptys     r   empty_dfr     s\    }MMsww#''-C DE EKKLr   c                  6    t        j                  g d      } | S )N)SymbolCompanyzEarnings DatezEPS EstimatezReported EPSzSurprise(%)columns)r   r   )r   s    r   empty_earnings_dates_dfr     s    MM@AE Lr   c                 `    g g g g fd| d   D ]  } |d        fS )a  
    build_template returns the details required to rebuild any of the yahoo finance financial statements in the same order as the yahoo finance webpage. The function is built to be used on the "FinancialTemplateStore" json which appears in any one of the three yahoo finance webpages: "/financials", "/cash-flow" and "/balance-sheet".

    Returns:
        - template_annual_order: The order that annual figures should be listed in.
        - template_ttm_order: The order that TTM (Trailing Twelve Month) figures should be listed in.
        - template_order: The order that quarterlies should be in (note that quarterlies have no pre-fix - hence why this is required).
        - level_detail: The level of each individual line item. E.g. for the "/financials" webpage, "Total Revenue" is a level 0 item and is the summation of "Operating Revenue" and "Excise Taxes" which are level 1 items.

    c                     |dkD  ryj                  d| d           j                  d| d           j                  | d           j                  |       d| v r| d   D ]  } ||dz           yy)z
        A recursive function that visits a node and its children.

        Args:
            node: The current node in the data structure.
            level: The depth of the current node in the data structure.
           Ntrailingkeyannualchildrenr`   )append)nodelevelchildlevel_detailtemplate_annual_ordertemplate_ordertemplate_ttm_ordertraverses      r   r   z build_template.<locals>.traverse.  s     19!!HT%[M":;$$vd5k]%;<e/E"j) +	*+ r   templater   r   )r   r   r   r   r   r   r   s     @@@@@r   build_templater     sW     NL+ +$ J a 4nlRRr   c                 h   g }g }| j                  di       j                         D ]d  \  }}	 |r\d|i}|D ](  }|s|j                  d      ||j                  d      <   * d|v r|j                  |       nd|v r|j                  |       f ||fS # t        $ r}t	        d|        Y d}~d}~ww xY w)	a  
    retrieve_financial_details returns all of the available financial details under the
    "QuoteTimeSeriesStore" for any of the following three yahoo finance webpages:
    "/financials", "/cash-flow" and "/balance-sheet".

    Returns:
        - TTM_dicts: A dictionary full of all of the available Trailing Twelve Month figures, this can easily be converted to a pandas dataframe.
        - Annual_dicts: A dictionary full of all of the available Annual figures, this can easily be converted to a pandas dataframe.
    
timeSeriesr   reportedValueasOfDater   r   z,An error occurred while processing the key: N)r   r   r   KeyErrorprint)r   	TTM_dictsAnnual_dictsr   
timeseriestime_series_dicteaches           r   retrieve_financial_detailsr   F  s     IL88L"5;;= FZ	F$+S> & WD =AXXo=V$TXXj%9:W $$$%56_ ''(89F l""  	F@DEE	Fs   AB	B1B,,B1c                 $   t         j                  j                  |      j                  d      }|j	                  |      }|j
                  j                  j                  dd      |_        |r|rt         j                  j                  |      j                  d      j	                  |      }|j                  D cg c]  }dt        |      z    c}|_        |j
                  j                  j                  dd      |_        |j                  |dd      }n|}t        |j                  j
                        |_        | |d<   |j                  |j
                  dg      }|t        |j                  d	         }|j                  d
      }|S c c}w )z
    format_annual_financial_statement formats any annual financial statement

    Returns:
        - _statement: A fully formatted annual financial statement in pandas dataframe.
    r   r   r   zTTM r   T)
left_indexright_indexr   reverseallhow)r   r   	from_dict	set_indexreindexr   rK   replacer   mergecamel2titleTsorteddropna)	r   annual_dictsannual_order	ttm_dicts	ttm_orderAnnualTTMcol
_statements	            r   !format_annual_financial_statementr  d  sH    ]]$$\2<<WEF^^L)F<<##++Ir:FL Ymm%%i0::7CKKIV 58KK@SvC(@IIMM))+r:	\\#$D\I

":<<#5#56J!-J~%%z'7'7&HIJF:#5#5tDEJ""u"-J As   :Fc                 T   | j                  |      } t        | j                        | _        || d<   | j	                  | j                  dg      } | t        | j                  d         } | j                  d      } t        j                  | j                        j                  | _        | S )z
    format_quarterly_financial_statements formats any quarterly financial statement

    Returns:
        - _statement: A fully formatted quarterly financial statement in pandas dataframe.
    r   Tr   r   r   )r  r  r  r   r  r  r   r	  r   to_datetimedate)r  r   orders      r   $format_quarterly_financial_statementr    s     ##E*J":<<0J!-J~%%z'7'7&HIJF:#5#5tDEJ""u"-J););<AAJr   stringssepacronymsreturnc           	         t        | t              st        | d      st        d      t	        |       dk(  r| S t        | d   t              st        d      t        |t              rt	        |      dk7  rt        d| d      t        j                  d|      rt        d| d      t        j                  |      |k7  r|d	vrt        d| d
      |;d}d| d}| D cg c]'  }t        j                  |||      j                         ) c}S t        |t              st        |d      rt        |d   t              st        d      |D ]'  }t        j                  d|      rt        d| d       d}d| d}| D cg c]  }t        j                  |||       } }|D ]2  }d| d}d| d}| D cg c]  }t        j                  |||       } }4 | D cg c]  }|j                  |       } }| D cg c]&  }|D cg c]  }||vr|j                         n| c}( } }}| D cg c]  }|j                  |       } }| S c c}w c c}w c c}w c c}w c c}w c c}}w c c}w )N__iter__z<camel2title() 'strings' argument must be iterable of stringsr   r`   z camel2title() 'sep' argument = 'z' must be single characterz[a-zA-Z0-9]z' cannot be alpha-numeric>   rC   -z' cannot be special characterz([a-z])([A-Z])z\g<1>z\g<2>z=camel2title() 'acronyms' argument must be iterable of stringsz^[A-Z]+$zEcamel2title() 'acronyms' argument must only contain upper-case, but 'z
' detected(z)([A-Z][a-z]))r7   rK   r9   r    r   r   rq   rw   escapesubtitlerM   rL   )r  r  r  patrepsajs           r   r  r    s|   '3ww
'CVWW
7|qgaj#&VWWc33s8q=;C5@Z[\\
yy$;C5@YZ[[
zz###Z"7;C5@]^__se5!6=>S!$**,>> (C *(EZX`abXcehMiWXX tyyQ'defdggqrsst
 C3%u
C-45swwsC#5G5  :!M"se5!189A3773Q'99: &--qwws|-G-KRSaqA!Qh.	A5ASGS$+,qsxx{,G,N3 ? 6 : .AS,s6   !,I
I7II<	I#I"I#.I)I#c                     | j                  d      d   dj                  d | j                  d      dd  D              z   }|S )Nr6   r   r   c              3   <   K   | ]  }|j                           y wr   )r"  )r{   xs     r   r~   z)snake_case_2_camelCase.<locals>.<genexpr>  s     "G1779"Gs   r`   )rM   rL   )r%  scs     r   snake_case_2_camelCaser,    s;    	
a277"Gaggcl126F"GG	GBIr   c                    t        | t              rt        j                  | d|      } | S t        | t              r)t
        j                  j                  t	        |       d      } t        | t
        j                        rMt        | t
        j                        s3t
        j                  j                  | t        j                  d            } t        | t
        j                        rX| j                  &t        j                  |       j                  |      } | S t        j                  |       j                  |      } | S t        d|  dt        |              )Nr%  )unittzz%Y-%m-%dr   zUnable to parse input dt z	 of type )r7   rs   r   	TimestamprK   	_datetimedatetimestrptimer  combinetimetzinfotz_localize
tz_convertr   r!   )dtexchange_tzs     r   _parse_user_dtr;    s   "c]]2CK8 I b###,,SWjABb)..)*RASAS2T##++B	q0ABBb),,-yy ]]2&22;?
 I ]]2&11+> I 8Id2hZPQQr   c                 ,   | d   dk(  rt        t        | d d             S | dd  dk(  rt        t        | d d             S | dd  dk(  rt        t        | d d             S | d   d	k(  rt        t        | d d       
      S t        j                  |       S )Nddayswk)weeksmo)monthsy)years)r   rs   r   	Timedelta)intervals    r   _interval_to_timedeltarJ    s    |s#hsm"455	"#$	3x}#566	"#$	C"$677	"	3x}#566}}X&&r   c                 J    | yd}t        t        j                  ||             S )z0Check if the provided period has a valid format.Fz^[1-9]\d*(d|wk|mo|y)$)r   rerw   )periodvalid_patterns     r   is_valid_period_formatrO    s'    ~ -M/00r   c                 X   | j                   }| j                         }|d   |d   z  j                         }|d   |z  |d<   |d   |z  |d<   |d   |z  |d<   |j                  g d	d
d       |j	                  dddddd       ||D cg c]  }||j                   v s| c}   S c c}w )Nr   r   r   Adj Openr   Adj Highr   Adj Low)r   r   r   r   r`   Taxisinplace)rQ  rR  rS  r   r   rV  )r   copyto_numpydroprenamer   	col_orderdfratiocs        r   auto_adjustra    s    I	B_r'{*446EZ%'BzNZ%'BzNuI%ByMGG(   IIw   
 )7QqBJJq7887s   
B'B'c                 :   | j                   }| j                         }|d   |d   z  }|d   |z  |d<   |d   |z  |d<   |d   |z  |d<   |j                  g d	d
d       |j                  ddddd       ||D cg c]  }||j                   v s| c}   S c c}w )z4 back-adjusted data to mimic true historical prices r   r   r   rQ  r   rR  r   rS  )r   r   r   r   r`   TrT  )rQ  rR  rS  rW  )r   rX  rZ  r[  r\  s        r   back_adjustrc    s     I	B{Obk)EZ%'BzNZ%'BzNuI%ByMGG,   II   
 )7QqBJJq7887s   ;BBc           	         | d   }| d   d   d   }|d   }|d   }|d   }|d   }|d	   }|}d
| d   v r| d   d
   d   d
   }t        j                  ||||||d      }	t        j                  |d      |	_        |	j	                  d       dD ]2  }
t        |	|
   j                        r|	|
   j                  d      |	|
<   4 |	S )N	timestamp
indicatorsquoter   volumeopencloselowhighadjcloser   r%  r.  TrV  )r   r   r   r   r   float)r   r   r  r   
sort_indexr
   dtypeastype)r   
timestampsohlcvolumesopenscloseslowshighsrm  r   r`  s              r   parse_quotesr{    s    k"Jg&q)D8nGLE']F;DLEHT,''%j1!4Z@]]E$)#'%+)1&-/ 0F ??:C8FL
d#: 2fQioo.q	((1F1I2 Mr   c                    d }d }d }d| v r2d| d   v rt        | d   d         dkD  rt        j                  t        | d   d   j	                                     }|j                  dd       t        j                  |j                  d	      |_        |j                  d       d
|j                  v r)|d
   dk(  j                         r|j                  d
d      }|j                  ddi      }d| d   v rt        | d   d         dkD  rt        j                  t        | d   d   j	                                     }|j                  dd       t        j                  |j                  d	      |_        |j                  d       dg|_	        d| d   v rt        | d   d         dkD  rt        j                  t        | d   d   j	                                     }|j                  dd       t        j                  |j                  d	      |_        |j                  d       |d   |d   z  |d<   |dg   }|+t        j                  dgt        j                  g             }|+t        j                  dgt        j                  g             }|+t        j                  dgt        j                  g             }|||fS )Nevents	dividendsr   )r   r  Tro  r%  rn  currencyr   r`   rU  amount	Dividendsr   capitalGainsCapital Gainssplits	numeratordenominatorStock Splits)r   r   )r   r   r   listvaluesr  r  r   rq  r   r   rZ  r[  DatetimeIndex)r   r~  capital_gainsr  s       r   parse_actionsr  7  s   IMF4$x.(Sh1L-MPQ-Q$x.5<<>?AI5!ooiooCHIO   .Y...Ij4IR4O3T3T3V%NN:AN>	!(((K1H(IIT(^+DN>4R0SVW0WMM$x.8??ABDM##FD#9"%//-2E2EC"PM$$T$2%4$5M!tH~%#d8nX.F*G!*K]]$x.299;<>FVT2??6<<cBFLd+%+K%86-;P%PF>"^,-FMM M):):2)>@	$%S->->r-BD~#$C,=,=b,AC fm++r   c                     | j                   j                   | j                   j                  d      | _         | j                   j                  |      | _         | S )NUTC)r   r/  r7  r8  )r^  rI  r/  s      r   	set_df_tzr  f  sA    	xx{{88''.xx""2&BHIr   c                    |j                         }|j                  j                  |d<   | j                  j                  | d<   | j                  j                         }| j                  |d      } || _        | j                  | d   k\  }t	        |      }|| j                  |z   | d   k  z  }|j                         r| |    } | j                  g dd      } | S )	N_dateleftr   endstart)r  r  r  r`   r  )rX  r   r  r  rJ  anyrZ  )r   rI  tradingPeriodstps_dfidxf_droptds          r   'fix_Yahoo_returning_prepost_unrequestedr  m  s       "Fll''F7Oll''F7O
,,


C\\&f\-FFL\\VE]*F		)Bv||b(F7O;<Fzz| [[2[;FMr   c                    |dk(  r#| j                         |j                         k(  }|S |dk(  r|| z
  j                  dk  }|S |dk(  r6| j                  |j                  k(  xr | j                  |j                  k(  }|S |dk(  rm| j                  dz  dz
  }| j                  |z
  dz
  dz  dz   }|j                  |z
  dz
  dz  dz   }|j                  | j                  z
  }||z
  d|z  z   }|d	k(  }|S || z
  t	        j
                  |      k  }|S )
N1d1wk   1mo3mo   r`      r   )r  r@  monthyearr   rH  )	dt1dt2rI  last_rows_same_intervalshiftq1q2	year_diffquarter_diffs	            r   _dts_in_same_intervalr    s6    4"%((*
": #" 
U	#&9"2"2Q"6 #" 
U	"%))syy"8"QSXX=Q #" 
U	Q!#ii%!#)A-ii%!#)A-HHsxx'	Bw9,".!"3 #" $'9h0G"G""r   c                 \
   |d   dvrd}d }t        |       dkD  r| j                  d   }| j                  d   }| j                  j                  "|j                  d      }|j                  d      }|j	                  |      }|j	                  |      }|dk(  re|j                         |j                         k(  r@| j                  d   }t        j                  | j                  d d | j                  dd  g      } | |fS t        |||      r| j                  d   }	| j                  d   }
|	|
k(  r| d fS |r|j                  dk(  r| d fS | d	   j                  dd  j                  dd      j                         }|r|d
k(  rd}nd}t        ||z  dz
        dkD  r| j                  |	t        j                   f   | j                  |
t        j                   f   z  }||z  dz
  j                         dk  j#                         r/t        j                   D ]  }| j                  |
|fxx   dz  cc<    nU||z  dz
  j                         dk  j#                         r.t        j                   D ]  }| j                  |
|fxx   dz  cc<    t%        j&                  | j                  |
df         r!| d   j                  d   | j                  |
df<   t%        j&                  | d   j                  d         st%        j(                  | d   j                  d   | d   j                  d   g      | j                  |
df<   d| j*                  v rFt%        j(                  | d   j                  d   | d   j                  d   g      | j                  |
df<   t%        j&                  | d   j                  d         st%        j,                  | d   j                  d   | d   j                  d   g      | j                  |
df<   d| j*                  v rFt%        j,                  | d   j                  d   | d   j                  d   g      | j                  |
df<   | d   j                  d   | j                  |
df<   d| j*                  v r!| d   j                  d   | j                  |
df<   | j                  |
dfxx   | d   j                  d   z  cc<   | j                  |
dfxx   | d   j                  d   z  cc<   |dk7  r|| j                  |
d	f<   | j                  d   }| j/                  | j                  d         } | |fS )Nr=  )rP   r   Fr`   rA  r  r  r   r  KWFi  d   g      ?g?g{Gz?r   r   rR  r   rS  r   r   r   r  g      ?)r   r   r/  r7  r8  r  ilocr   concatr  secondr  prodabslocr   _PRICE_COLNAMES_r   r   isnannanmaxr   nanminrZ  )r   rI  tz_exchangeprepostrepairr  dropped_rowr  r  idx1idx2sscurrency_divider_  r`  s                  r   !fix_Yahoo_returning_live_separater    s    |:%K
6{Qll2ll2<<??"//%(C//%(Cnn[)nn[)t xxzSXXZ'$kk"oV[["%5v{{237G$HIz ;w %S#x8||B'||B'4< "4<'zzQ%t|+N+005==aBGGI  5(*.*-2o-a/047 &

41G1G+G H6::VZ\a\r\rVrKs s"?21499;dBGGI%*%;%; ; &

47 3s : 3;#O3A5::<tCHHJ%*%;%; < &

47 3t ; 3< 99VZZf56/5f~/B/B2/FFJJtV|,yy!4!4R!89/2zz6&>;N;Nr;RTZ[aTbTgTghjTk:l/mFJJtV|,!V^^37:zz6*CUCZCZ[]C^`fgq`r`w`wxz`{B|7}

4#34yy!3!3B!78.1jj&-:L:LR:PRXY^R_RdRdegRh9i.jFJJtU{+ FNN269jj&BSBXBXY[B\^den^o^t^tuw^xAy6z

4?3,27O,@,@,D

4=)&..04:;4G4L4LR4PFJJt[01

4>*fX.>.C.CB.GG*

4,-1D1I1I"1MM-979FJJt^34$kk"oV\\"%56;r   c           	         | j                   r| S |j                  D cg c]	  }|| vs| }}|d   }| j                         } |j                  d      xs |j                  d      }t	        |      }|r| j
                  j                  | d<   |j
                  j                  |d<   t        j                  t        j                  | d   | d   j                  d   |z   g      |d   d      }| j                  dd	      } |j                  dd	      }nUt        j                  t        j                  | j
                  | j
                  d   |z         |j
                  d
      }|dz  }|rt        t        |j
                              D ]|  }	|j
                  |	   j                         }
|
| j
                  d   j                         k  s8|
| j
                  d   j                         t        j                  d      z   k\  sxd||	<   ~ n_t        t        |j
                              D ]>  }	|j
                  |	   }
|
| j
                  d   k  s|
| j
                  d   |z   k\  s:d||	<   @ |dk(  }|j!                         r|r||    }|j                   rd| d<   | S | j
                  j                  | d<   |j
                  j                  |d<   t        j                  t        j                  | d   | d   j                  d   |z   g      |d   d      }| j                  dd	      } |j                  dd	      }n=i t"        j$                  D ci c]  }|t        j&                  g c}ddgi}|dk(  rt        j(                  |      d   D ]p  }	|j
                  |	   }
t+               j-                  d| d|
j                          d       t/        j0                  ||
g      }t/        j2                  | |gd      } r n| j
                  d   }||z   }||z   }t        j(                  |      d   D ]  }	|j
                  |	   }
||
cxk  r|k  sn !t+               j-                  d| d|
j                          d       t/        j0                  ||
g      }t/        j2                  | |gd      }  | j                         } t        j                  t        j                  | j
                  | j
                  d   |z         |j
                  d
      }|dz  }t        t        |j
                              D ]>  }	|j
                  |	   }
|
| j
                  d   k  s|
| j
                  d   |z   k\  s:d||	<   @ |dk(  }|j!                         rp|s|dv r!t5        d| d| d|j
                  |          t+               j-                  d| ddz   t7        ||         z          ||    j9                         }||    }d }| j
                  |   } ||||      }| j;                  |      }||   j=                         }t?        |       |j@                  d   k  }|rt5        d      |S c c}w c c}w )Nr   rP   r%  r  r=  r  )sider`   r  rightr?  g        r  r   r  zAdding out-of-range z @ z in new prices row of NaNs)r   r   T)sort)r  r  zThe following 'z8' events are out-of-range, did not expect with interval r   zDiscarding these z events:rE   c                    t        |      t        t        |            k(  r	|| _        | S || d<   |dv r1| j                  d      j	                         } d | j                  _        nE|dk(  r1| j                  d      j                         } d | j                  _        nt        d| d      d| j                  v r| j                  dd      } | S )N	_NewIndex)r  r  r  z?New index contains duplicates but unsure how to aggregate for 'r   r`   r  )
r   setr   groupbysumr<   r  r   r   rZ  )r^  	new_indexdata_col_names      r   _reindex_eventsz'safe_merge_dfs.<locals>._reindex_eventsT  s    y>SY00 BHI#;::K(,,.B BHHMn,K(--/B BHHM _`m_nnopqq"**$1-B	r   z#Data was lost in merge, investigate)!r   r   rq  endswithrJ  r   r  r   searchsortedr   r  rZ  ranger   r1  	timedeltar  r   r  r   whererF   rg   r   r   r  r   rK   rX  rL   isnar  shape)df_maindf_subrI  r`  	data_colsdata_colintradayr  indicesrO   r9  f_outOfRangeempty_row_data	empty_rowlast_dtnext_interval_start_dtnext_interval_end_dtr  r  r^  f_na	data_losts                         r   safe_merge_dfsr    sM   }}"NN?qaw.>?I?|H  "G  %?):):3)?H		)B #==-- ,,++w""3::gg.>AQAVAVWYAZ[]A]@^#_aghoapw}~,,wQ,/W1-""3::gmmW]]2=NQS=S#TV\VbVbipq1s6<<() 	 Aa%%'BGMM!$))++rW]]25F5K5K5MPYPcPcijPk5k/k
		  s6<<() 	 AaBGMM!$$gmmB.?".D(D
		  b=L\M*F||'*$  '}}11GG$ll//F7O&&szz''2BWWEUEZEZ[]E^_aEaDb'ceklset  |B  CGll7l3G[[q[1F\e6L6L MCGG9 M\xYZX[\N4<03 JAaB!O)),@
#bggi[Xr*st #>" NI!jj'9)=DIG	J "--+)02&'='B$<03 NAaB-J6JJ%--0DXJcRTRYRYR[Q\\v.wx$'MM~bT$R	"%**gy-A"MN ((*G &&szz'--rARUWAW'XZ`ZfZfmtuGqLG3v||,- $\\!_a((B'--2Cb2H,H!#GAJ	$ b=Lx=0z9qrzq{{}  E  K  K  LX  Y  ~Z  [  \  \ 1(8DtKcRXYeRfNggh&++-<-(, g&IVY9F	f	Bh<DTE
V\\!_,I?@@Iq @b !Ns   	Y$Y$
Y)c                 l   |dv r| j                   j                  dk(  | j                   j                  j                  ddg      z  }t	        j
                  dg| j                  d   z        }d| j                   |   j                  z
  ||<   | xj                   t        j                  |d      z  c_         | S )N)r  1wr  r            r   )	r   minutehourr   r   arrayr  r   to_timedelta)r^  rI  f_pre_midnightdst_error_hourss       r   fix_Yahoo_dst_issuer  v  s    &&
 ((//Q.288==3E3Er2h3OP))QC"((1+$56*,rxx/G/L/L*L'
C$$_c::Ir   r/  c                 N    	 t        j                  |        y# t        $ r Y yw xY w)NFT)_tztimezoner   )r/  s    r   is_valid_timezoner    s,    R    s    	$$Tc                    t        | t              s| S t        |       dk(  r| S | d   }|sdD ]N  }|| v s| |   t        | |   t              s"t	        j
                  | |   dd      j                  |      | |<   P d| v r{dD ]v  }|| d   v st        | d   |   d	   t              s%d
D ];  }t	        j
                  | d   |   |   dd      j                  |      | d   |   |<   = | d   |   d= | d   |   d= x d| v r| d   }|g g dk(  r	 | S t        |t        t        f      rt        |t              rt        j                  j                  t        j                  |            }|j                  ddgd      }t	        j
                  |d	   dd      j                  j                  |      |d	<   t	        j
                  |d   dd      j                  j                  |      |d<   n|t        |t              rkt        j                  j                  t        j                  |d               }t        j                  j                  t        j                  |d               }	t        j                  j                  t        j                  |d               }
|j                  ddd
      j                  ddgd      }|	j                  ddd
      j                  ddgd      }	|
j                  ddgd      }
g d}|
j                  |      j                  |	      }|D ]9  }t	        j
                  ||   dd      j                  j                  |      ||<   ; ||   }t	        j
                  d	   j                  j                         |_        |j"                  j%                  |      |_        d|j"                  _        || d<   | S )Nr   exchangeTimezoneName)firstTradeDateregularMarketTimer%  T)r.  utccurrentTradingPeriod)regularprepostr  )r  r  	gmtoffsetr  r  )r  r   r`   r  r  r  r   r  	pre_startpre_endr   
post_startpost_end)r  r  r  r  r  r  r   )r7   dictr   rs   r   r  r8  r  r   from_recordsr   hstackrZ  r9  r[  rL   r  r   r7  r<   )mdtradingPeriodsOnlyr/  krP   ttpsr^  pre_dfpost_df
regular_dfcolsr`  s                r   format_history_metadatar    s   b$	
2w!|		"	#B8 	VABw2a5,beS)OOBqEFQQRTUBqE	V
 "R'/ B122z"E[B\]^B_`gBhjm7n- qOOB/E,Fq,I!,LSV\`allmop 1215a8q 1215kB1215jAB 2!""b))< I; dD\*#t$]]//

3@WWj+6QW?!oobkNQQ\\]_`7OOBuICTJMMXXY[\5	C&33CJJs5z4JK--44SZZF5LM ]]77

3y>8RS
Y/WX]]_ikv^w~]  A!..<PZ1[.\aacmozb{  CDa  E'__j+-FQ_O
Y__V,11': YAOOBqEFIITTUWXBqEYXr'{~~':':;BHxx++B/BH"BHHM#%B Ir   c                   6    e Zd ZddZd Zd	dZd	dZd Zd Zy)
ProgressBarc                 z    || _         || _        d| _        d| _        d| _        | j                  d       d| _        y )Nz[]*2   r   r`   )text
iterationsprog_bar	fill_charwidth_ProgressBar__update_amountelapsed)r   r  r  s      r   rV   zProgressBar.__init__  s:    	$
Qr   c                 <   | j                   | j                  kD  r| j                  | _         | j                  d       t        dt	        |       z   dt
        j                         t
        j                  j                          t        dt
        j                         y )Nr`   r   r  file)r"  )r  r  update_iterationr   rK   _sysstderrflushr   s    r   	completedzProgressBar.completed  sb    <<$//)??DLa dSYBT[[9bt{{#r   Nc                 "   |"| xj                   dz  c_         | j                   }n| xj                   |z  c_         t        dt        |       z   dt        j                         t        j                  j                          | j                          y )Nr`   r   r   r!  )r  r   rK   r$  r%  r&  r#  )r   	iterations     r   animatezProgressBar.animate  sb    LLALILLI%LdSYBT[[9r   c                     ||n!| j                   t        | j                        z  }| j                  |dz         | xj                  d| j                    d| j                   d| j
                   z  c_        y )N      Y@  z of rC   )r  rp  r  r  r  r  )r   vals     r   r#  zProgressBar.update_iteration  s_    _c$,,t9O*OS5[)2dll^4/@$))MMr   c                    t        t        |dz  dz              }| j                  dz
  }t        t        |dz  |z              }d| j                  |z  z   d||z
  z  z   dz   | _        t        | j                        dz  t        t        |            z
  }| d}| j                  d| || j                  |t        |      z   d  z   z   | _        y )Nr,     [rC   ]%r   )rs   roundr  r  r  r   rK   )r   
new_amountpercent_doneall_full
num_hashes	pct_place
pct_strings          r   __update_amountzProgressBar.__update_amount  s    5*u"4!=>?::>u 4@AB
dnnz99C8jCX<YY\__'1,C4E0FF	$~Q'
a	2j4==QZ]`ak]lQlQmCn6nor   c                 ,    t        | j                        S r   )rK   r  r   s    r   __str__zProgressBar.__str__  s    4==!!r   )r'  r   )	r"   r,   r-   rV   r'  r*  r#  r  r=  r   r   r   r  r    s"    $	 N
p"r   r  placeholdersc                       fd}|S )z
    A decorator to dynamically update the docstring of a function or method.
    
    Args:
        placeholders (dict): A dictionary where keys are placeholder names and values are the strings to insert.
    c                     | j                   rA| j                   }j                         D ]  \  }}|j                  d| d|      } || _         | S )N{})r.   r   r  )rj   	docstringr   r=   r>  s       r   	decoratorz$dynamic_docstring.<locals>.decorator  sW    <<I*002 C
U%--3%rlEB	C$DLr   r   )r>  rD  s   ` r   dynamic_docstringrE    s     r   c                 @    dd l }| d} |j                  d|  d      }|S )Nr   zPermitted Keys/Valuesz
    .. list-table:: zT
       :widths: 25 75
       :header-rows: 1

       * - Key
         - Values
    )textwrapdedent)r"  rG  tables      r   _generate_table_configurationsrJ    s8    }'OO !G  	E Lr   r   bulletsr"  c           	      v   t        |      }t        | j                               D ]  }| |   }|dd| dz   z  }|D cg c]  }t        t	        |             }}|r0t        |      dkD  r"|dz  }t        |      D ]  }|dd| dz   z  } gdj                  t        |            }	|d	d|	 dz   z  } |S c c}w )
P
    Generate a list-table for the docstring showing permitted keys/values.
       * - rE   r        -
       - ,      )rJ  r  keysr   rK   maxrL   )
r   rK  r"  rI  r  r  vlengthsr=   	value_strs
             r   generate_list_table_from_dictrZ    s     +51EDIIK  
0a4s"%%(./13s1v;//s7|a']"E 02eWB//0 		&.1IUr)B///E
0 L 0s   B6c           	         t        |      }| j                         D ]  }| |   }|dd| dz   z  }t        |t              r
d}||v }|rt	        t        |j                                     }	d}
d|	v }t        t        |	            D ]  }|	|   }||   }d}t        |t              rt        |      }n t        |t              rt        |      dk(  rg }t        |t
              r?t	        |      }t        d |D              }|r t        j                  d	dt        |            }|t        |      }t        |
      dkD  r$t        |
      t        |      z   d
kD  r
||
dz   z  }d}
|r2|
dk(  r|
dz  }
|dk(  r|
dz  }
n|
dz  }
|
dz  }
n|
dz  }
|
| d|z   z  }
|dz  }|dk(  r|dz  }n|dz  }d|v r]|d| dz   dz   z  }|j                  d      }t        t        |            D ]&  }||   }|d|z   z  }|t        |      dz
  k  s"|dz  }( n|r|dz  }n|dz  }|| d|z   z  }|dz  } |
dk7  r||
dz   z  }n|dd| dz   z  }||z  }0|D cg c]  }t        t        |             }}|r1t        |      dkD  r#|dz  }t	        |      D ]  }|dd| dz   z  } dj                  t	        |            }|dd| dz   z  } |S c c}w )rM  rN  rO  rE   r   r   Nr   c              3   R   K   | ]  }t        |t        t        t        f       ! y wr   )r7   rs   rp  rK   )r{   k2vs     r   r~   z:generate_list_table_from_dict_universal.<locals>.<genexpr>T  s     (aPSC#uc9J)K(as   %'z	[{}\[\]'](   rT  rR  r-  z| z.  r   z       |     r`   z* r   rP  rQ  rS  )rJ  rU  r7   r  r  r  r  r   r  r   rq   r!  rK   rM   rV  rL   )r   rK  r"  concat_keysrI  r  r  	table_addconcat_short_linesk_keyscurrent_lineblock_formatrO   k2	k2_valuesk2_values_str
all_scalark2_values_str_linesr'  r|   rW  rX  r=   rY  s                           r   'generate_list_table_from_dict_universalrj  8  sv    +51EYY[ X4a4s"%%fd#I!"k!1V[[] 34!&&0s6{+ ;*AB &r
I$(M!)S1$(O	#It4Y19L$&	!)T2$*9$5	%((aW`(a%a
%,/GGL"c)n,UM$,(+I<(1,#l2Cc-FX2X[]2]!\D%88	'))'2-(E1L Av , 4 , 4(D0L(E1L$2$b	M(AA!U*	6%-I%-I=0%2$b	)9D)@@I2?2E2Ed2K/%*3/B+C%D 6':1'= )-@4-G G	#$s+>'?'A#A$-$5I	6  , )T 1	 )T 1	%B4r])BBI!T)	w;*x  2%!44IUr&_44	YE -33qs3q6{3G33w<!+&#F^ 4EUr%^33E4 !IIfVn5	2i[!333qX4t L 4s   Kr   )NN)rC   N)FN)T)TN)^
__future__r   r2  r1  rH   rL  rq   sysr$  	threading	functoolsr   inspectr   typesr   typingr   r	   r   numpyr   pandasr   pandas.api.typesr
   pytzr  dateutil.relativedeltar   r   rf   r   yfinance.exceptionsr   yfinance.configr   r   ImportErrorr  r?   LoggerAdapterrA   localrY   rS   rc   rl   	Formatterrn   r   r   Filterr   rF   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rK   r  r,  r  r;  rJ  rO  ra  rc  r{  r  r  r  r  r  r  r  r   r  r  r  rE  rJ  rZ  rj  r   r   r   <module>r~     sD  , &   	       !    +  0 %  + $%4S'//  %Y__& 4 4n
(** (8 	W^^ "  G24
"
 
%SP#<<"+c + +htCy>Q +]abe]f +\
 $'77 (
'19(9,8,,^:#*Up|~
# $ 9x," ,"\D "C  t  VY F GKW[ik _$ _ _SV _ps _K   T s   .F F0/F0