
    Wg              
          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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Zd dlmZ d dlmZ d d	lm Z  d
diZ!d Z" ed      d        Z# G d dejH                        Z% e	jL                         Z' G d d      Z(dHdZ)d Z* G d dejV                        Z,da-da. G d dej^                        Z0d Z1d Z2d Z3dIdZ4dIdZ5dId Z6dId!Z7dHd"Z8d# Z9d$ Z:d% Z;dId&Z<d' Z=dJd(ee>   d)e>d*eee>      d+ee>   fd,Z?d- Z@d. ZAd/ ZBd0 ZCd1 ZDd2 ZEd3 ZFd4 ZGd5 ZHd6 ZIdKd7ZJd8 ZKd9 ZLd:e>d+eMfd;ZNdLd=ZO G d> d?      ZPd@eQfdAZRdHd+e>fdBZSdMdCeQdDeMdEe>d+e>fdFZTd<dg fdCeQdDeMdEe>d+e>fdGZUy)N    )print_functionN)	lru_cachewraps)
getmembers)FunctionType)ListOptional)relativedelta)UnknownTimeZoneError)constz
User-AgentzxMozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36c                     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   type
isinstancer   dirhasattrgetattr)objnamevaluedisallowed_namess       A/var/www/html/venv/lib/python3.12/site-packages/yfinance/utils.py
attributesr   1   s     *49 5,ue\* 	, , .1XS%)7c>d*::wsD?Q 	gc4  S S,Ss   A3,A9   )maxsizec                     t        |        y N)print)msgs    r   
print_oncer    :   s     
#J    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extrar   strjoinsplit)selfr   kwargsims        r   processzIndentLoggerAdapter.processE   sp    ?''6djj**Ac3'#h))CIIdO<qQU<=CF{ =s   3B
N)__name__
__module____qualname__r4    r!   r   r#   r#   D   s    r!   r#   c                        e Zd ZddZd Zd Zy)IndentationContextc                     || _         y r   )	increment)r0   r<   s     r   __init__zIndentationContext.__init__R   s	    "r!   c                 R    t        t        dd      | j                  z   t        _        y Nr&   r   )r   _indentation_levelr<   r&   r0   s    r   	__enter__zIndentationContext.__enter__U   s    $+,>!$Lt~~$]!r!   c                 J    t         xj                  | j                  z  c_        y r   )r@   r&   r<   )r0   exc_typeexc_valexc_tbs       r   __exit__zIndentationContext.__exit__X   s    !!T^^3!r!   N)   )r5   r6   r7   r=   rB   rG   r8   r!   r   r:   r:   Q   s    #^4r!   r:   c           	      b    t        t        j                  |       dt        t        dd      i      S r?   )r#   r*   	getLoggerr   r@   )r   s    r   get_indented_loggerrK   \   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 )rK   debugr5   r:   )argsr1   loggerresultfuncs       r   wrapperz%log_indent_decorator.<locals>.wrapperb   sp    $Z0yr23! 	+4*6*F	+ 	xb12		+ 	+s   	A((A1)r   )rS   rT   s   ` r   log_indent_decoratorrU   a   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+)srH   r   )superr=   _researchintgrouplevel_length)r0   fmtmatch	__class__s      r   r=   zMultiLineFormatter.__init__t   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 )Nr'   r   r%   rH   c              3   (   K   | ]	  }|z     y wr   r8   ).0linepaddings     r   	<genexpr>z,MultiLineFormatter.format.<locals>.<genexpr>   s     BWt^Bs   )rY   formatr/   lenr^   extendr.   )r0   recordoriginallines	levelname	formattedrf   ra   s         @r   rh   zMultiLineFormatter.formatz   s    7>&)t$!HNN3'*	u:?O q
I  A%I. 1 11sNGBab	BB99Y''r!   )r5   r6   r7   r=   rh   __classcell__)ra   s   @r   rW   rW   p   s    @( (r!   rW   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)r   r   rt   rv   rw   )r0   rk   r   s      r   filterzYFLogFormatter.filter   su    jj68$]]O2cU+C6=)''(3%0C6;'%%&b.C
r!   N)r5   r6   r7   rx   r8   r!   r   rr   rr      s    	r!   rr   c                      t         rt        d      at        S t        2t        j                  d      at        j                  t                      t        S )NrN   )yf_log_indentedrK   	yf_loggerr*   rJ   	addFilterrr   r8   r!   r   r(   r(      sH     '
3	  
	%%j1	N,-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 )NrN   r   z%(levelname)-8s %(message)s)r_   T)rz   r*   rJ   r{   setLevelr+   handlersri   StreamHandlerrW   setFormatter
addHandlerrK   )h	formatters     r   enable_debug_moder      s     %%j1	7==)%Y-?-?)@A)E%%'A*/LMINN9%  #')	 r!   c                 @    t        t        j                  d|             S )Nz ^([A-Z]{2})([A-Z0-9]{9})([0-9])$)boolrZ   r`   )strings    r   is_isinr      s    		<fEFFr!   c                 n   t        |       st        d      ddlm} |xs t        } || 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 numberrH   )Search)querymax_resultssessionproxyr   symbol 	shortnamelongname	quoteTypeexchDisp)r   r   r   r   exchange)tickernews)r   
ValueErrorr[   r   	_requestsquotesr   get)isinr   r   r   r[   r   r   s          r   get_all_by_isinr      s    DM.// "G$AweLF "(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   r   r   datas       r   get_ticker_by_isinr      s.    40D88Hb!%%h33r!   c                 @    t        | ||      }|j                  di       S )Nr   r   r   s       r   get_info_by_isinr      s!    40D88Hb!!r!   c                 @    t        | ||      }|j                  di       S )Nr   r   r   s       r   get_news_by_isinr      s!    40D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childrenrH   )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   r8   )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   itemsr   KeyErrorr   )r   	TTM_dictsAnnual_dictsr   
timeseriestime_series_dicteaches           r   retrieve_financial_detailsr     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   r-   replacer   mergecamel2titleTsorteddropna)	r   annual_dictsannual_order	ttm_dicts	ttm_orderAnnualTTMcol
_statements	            r   !format_annual_financial_statementr   =  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   rH   z camel2title() 'sep' argument = 'z' must be single characterz[a-zA-Z0-9]z' cannot be alpha-numeric>   r%   -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]))r   r-   r   	TypeErrorri   r   rZ   r`   escapesubtitler/   r.   )r   r   r   patrepsajs           r   r   r   l  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 )Nr   r   r   c              3   <   K   | ]  }|j                           y wr   )r  )rd   xs     r   rg   z)snake_case_2_camelCase.<locals>.<genexpr>  s     "G1779"Gs   rH   )r/   r.   )r
  scs     r   snake_case_2_camelCaser    s;    	
a277"Gaggcl126F"GG	GBIr!   c                 n   t        | t              r!t        j                  j	                  |        | S t        | t
              r)t        j                  j                  t        |       d      } t        | t        j                        rMt        | t        j                        s3t        j                  j                  | t        j                  d            } t        | t        j                        r0| j                  $t        j                  |      j                  |       } t        | j                               } | S )Nz%Y-%m-%dr   )r   r\   	_datetimedatetimefromtimestampr-   strptimer   combinetimetzinfo_tztimezonelocalize	timestamp)dtexchange_tzs     r   _parse_user_dtr     s    "c((, I b###,,SWjABb)..)*RASAS2T##++B	q0ABBb),,-"))2Ck*33B7B Ir!   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
   r\   r   	Timedelta)intervals    r   _interval_to_timedeltar/    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   rer`   )periodvalid_patterns     r   is_valid_period_formatr4    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   rH   Taxisinplace)r6  r7  r8  r   r   r;  )r   copyto_numpydroprenamer   	col_orderdfratiocs        r   auto_adjustrF    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   r6  r   r7  r   r8  )r   r   r   r   rH   Tr9  )r6  r7  r8  r<  )r   r=  r?  r@  rA  s        r   back_adjustrH    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       |	S )Nr  
indicatorsquoter   volumeopencloselowhighadjcloser   r
  unitTr;  )r   r   r   r   
sort_index)
r   
timestampsohlcvolumesopenscloseslowshighsrQ  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#Mr!   c                    d }d }d }d| v rd| d   v rt        j                  t        | d   d   j                                     }|j	                  dd       t        j
                  |j                  d      |_        |j                  d       d	g|_        d
| d   v rt        j                  t        | d   d
   j                                     }|j	                  dd       t        j
                  |j                  d      |_        |j                  d       dg|_        d| d   v 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	dividends)r   r   TrT  r
  rR  	DividendscapitalGainsCapital Gainssplits	numeratordenominatorStock Splits)r   r   )
r   r   listvaluesr   r   r   rU  r   DatetimeIndex)r   r`  capital_gainsrd  s       r   parse_actionsrl    s(   IMF4$x.($x.5<<>?AI5!ooiooCHIO   .!,IT(^+MM$x.8??ABDM##FD#9"%//-2E2EC"PM$$T$2%4$5M!tH~%]]$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   tztz_localize
tz_convert)rC  r.  ro  s      r   	set_df_tzrr  7  sA    	xx{{88''.xx""2&BHIr!   c                    |j                         }|j                  j                  |d<   | j                  j                  | d<   | j                  j                         }| j                  |d      } || _        | j                  | d   k\  }|| j                  | d   k  z  }|j	                         r| |    } | j                  g dd      } | S )	N_dateleftr   endstart)rt  rw  rv  rH   r:  )r=  r   r   r   anyr?  )r   r.  tradingPeriodstps_dfidxf_drops         r   'fix_Yahoo_returning_prepost_unrequestedr~  >  s       "Fll''F7Oll''F7O
,,


C\\&f\-FFL\\VE]*Fv||fWo56Fzz| [[2[;FMr!   c                    | j                   d   }|dkD  r| j                  |dz
     }| j                  |dz
     }| j                  j                  "|j                  d      }|j                  d      }|j	                  |      }|j	                  |      }|dk(  rT|j                         |j                         k(  r1t        j                  | j                  d d | j                  dd  g      } | S |dk(  r5|j                  |j                  k(  xr |j                  |j                  k(  }nt|d	k(  r|j                  |j                  k(  }nU|d
k(  r5|j                  |j                  k(  xr |j                  |j                  k(  }n||z
  t        j                  |      k  }|r/| j                  |dz
     }	| j                  |dz
     }
|	|
k(  r| 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z
     | j"                  |
df<   t+        j,                  | d   j                  |dz
           st+        j.                  | d   j                  |dz
     | d   j                  |dz
     g      | j"                  |
df<   d| j0                  v rLt+        j.                  | d   j                  |dz
     | d   j                  |dz
     g      | j"                  |
df<   t+        j,                  | d   j                  |dz
           st+        j2                  | d   j                  |dz
     | d   j                  |dz
     g      | j"                  |
df<   d| j0                  v rLt+        j2                  | d   j                  |dz
     | d   j                  |dz
     g      | j"                  |
df<   | d   j                  |dz
     | j"                  |
df<   d| j0                  v r$| d   j                  |dz
     | j"                  |
df<   | j"                  |
dfxx   | d   j                  |dz
     z  cc<   | j"                  |
dfxx   | d   j                  |dz
     z  cc<   |dk7  r|| j"                  |
df<   | j5                  | j                  |dz
           } | S )Nr   rH      rn  1dr&  r"  1wk1mo3morg  KWFi  d   g      ?g?g{Gz?r   r   r7  r   r8  r   r   r   ra  g      ?)shaper   ro  rp  rq  r   r   concatilocyearweekmonthquarterr-  r   prodabslocr   _PRICE_COLNAMES_r   r   isnannanmaxr   nanminr?  )r   r.  tz_exchangerepaircurrencyndt1dt2last_rows_same_intervalidx1idx2sscurrency_dividerD  rE  s                  r   !fix_Yahoo_returning_live_separater  Z  s   
 	QA1ull1q5!ll1q5!<<??"//%(C//%(Cnn[)nn[)t xxzSXXZ'V[["%5v{{237G$HIB M 5 *-((chh*>*W388sxxCW'U"*-))syy*@'U"*-((chh*>*]3;;RUR]R]C]'+.9h8O*O'&||AE*||AE*4< "M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/B1q5/IFJJtV|,yy!4!4QU!;</2zz6&>;N;NqSTu;UW]^dWeWjWjklopkpWq:r/sFJJtV|,!V^^37:zz6*CUCZCZ[\_`[`Cacijtcuczcz{|  @A  |A  dB  CC  8D

4#34yy!3!3AE!:;.1jj&-:L:LQQRU:SU[\aUbUgUghilmhmUn9o.pFJJtU{+ FNN269jj&BSBXBXYZ]^Y^B_aghqarawawxy|}x}a~A  7A

4?3,27O,@,@Q,G

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

4>*fX.>.C.CAE.JJ*

4,-1D1I1I!a%1PP-979FJJt^34V\\!a%%89Mr!   c           	         |j                   rt        d      | j                   r| S |j                  D cg c]	  }|| vs| }}t        |      dkD  rt        d      |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#                         rY|r||    }|j                   rDd| d<   | S 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       t1        j2                  ||
g      }t1        j4                  | |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       t1        j2                  ||
g      }t1        j4                  | |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!t        d| d| d|j                  |          t-               j/                  d| ddz   t7        ||         z          ||    j9                         }||    }d }| j                  |   } ||||      }| j;                  |      }||   j=                         }t?        |       |j@                  d   k  }|rt        d       |S c c}w c c}w )!NzNo data to mergerH   zExpected 1 data colr   r3   r
  rt  r"  ru  )siderx  rightr$  g        ra  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 ru   zDiscarding these z events:r'   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)ra  rc  rg  z?New index contains duplicates but unsure how to aggregate for ''rH   rx  )
ri   setr   groupbysumr   r  	Exceptionr   r?  )rC  	new_indexdata_col_names      r   _reindex_eventsz'safe_merge_dfs.<locals>._reindex_events  s    y>SY00 BHI#;::K(,,.B BHHMn,K(--/B BHHM]^k]llmnoo"**$1-B	r!   z#Data was lost in merge, investigate)!r   r  r   ri   rU  endswithr/  r   r   r   searchsortedr   r  r?  ranger  	timedeltary  r   r  r   wherer(   rO   r   r   r  r-   r=  r.   isnar  r  )df_maindf_subr.  rE  	data_colsdata_colintradaytdindicesr2   r  f_outOfRangeempty_row_data	empty_rowlast_dtnext_interval_start_dtnext_interval_end_dtr  r  rC  f_na	data_losts                         r   safe_merge_dfsr    s   ||*++}}"NN?qaw.>?I?
9~-..|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||'*$\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ohZ7opxoyy{  }C  }I  }I  JV  }W  |X  Y  Z  Z 1(8DtKcRXYeRfNggh&++-<-(, g&IVY9F	f	Bh<DTE
V\\!_,I=>>Ig @X !Ns   	W5W5W: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)rC  r.  f_pre_midnightdst_error_hourss       r   fix_Yahoo_dst_issuer  -  s    &&
 ((//Q.288==3E3Er2h3OP))QC"((1+$56*,rxx/G/L/L*L'
C$$_c::Ir!   ro  c                 N    	 t        j                  |        y# t        $ r Y yw xY w)NFT)r  r  r   )ro  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)rS  utccurrentTradingPeriod)regularprepostrw  )rw  rv  	gmtoffsetr  rz  )r  r  rH   rx  rv  r  r  r  	pre_startpre_endr   
post_startpost_end)r  r  rw  rv  r  r  r   )r   dictri   r\   r   r   rq  rh  r   from_recordsr   hstackr?  r  r@  r.   r   r   rp  r   )mdtradingPeriodsOnlyro  kr3   ttpsrC  pre_dfpost_df
regular_dfcolsrE  s                r   format_history_metadatar  B  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   rH   )text
iterationsprog_bar	fill_charwidth_ProgressBar__update_amountelapsed)r0   r  r  s      r   r=   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 )NrH   r   rv  file)r  )r  r  update_iterationr   r-   _sysstderrflushrA   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 )NrH   r  r   r  )r  r   r-   r  r   r  r  )r0   	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 r%   )r  floatr  r  r  r  )r0   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  r  [r%   ]%r   )r\   roundr  r  r  ri   r-   )r0   
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   )r-   r  rA   s    r   __str__zProgressBar.__str__  s    4==!!r!   )r  r   )	r5   r6   r7   r=   r  r  r  r  r  r8   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{})__doc__r   r   )rS   	docstringr   r   r  s       r   	decoratorz$dynamic_docstring.<locals>.decorator  sW    <<I*002 C
U%--3%rlEB	C$DLr!   r8   )r  r   s   ` r   dynamic_docstringr!    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  r#  tables      r   _generate_table_configurationsr&    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.
       * - r'   r        -
       - ,      )r&  r   keysri   r-   maxr.   )
r   r'  r  r%  r  ri  vlengthsr   	value_strs
             r   generate_list_table_from_dictr6    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 )r)  r*  r+  r'   r   r   Nr   c              3   R   K   | ]  }t        |t        t        t        f       ! y wr   )r   r\   r	  r-   )rd   k2vs     r   rg   z:generate_list_table_from_dict_universal.<locals>.<genexpr>  s     (aPSC#uc9J)K(as   %'z	[{}\[\]'](   r0  r.  r  z| z.  ru   z       |     rH   z* r   r,  r-  r/  )r&  r1  r   r  r   rh  r  ri   r  r   rZ   r  r-   r/   r2  r.   )r   r'  r  concat_keysr%  r  ri  	table_addconcat_short_linesk_keyscurrent_lineblock_formatr2   k2	k2_valuesk2_values_str
all_scalark2_values_str_linesr  re   r3  r4  r   r5  s                           r   'generate_list_table_from_dict_universalrF    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)r%   N)FN)T)TN)V
__future__r   r  r  r*   r1  rZ   sysr  	threading	functoolsr   r   inspectr   typesr   typingr   r	   numpyr   pandasr   pytzr  requestsr   dateutil.relativedeltar
   r   rN   r   user_agent_headersr   r    LoggerAdapterr#   localr@   r:   rK   rU   	FormatterrW   r{   rz   Filterrr   r(   r   r   r   r   r   r   r   r   r   r   r   r   r-   r   r  r   r/  r4  rF  rH  r]  rl  rr  r~  r  r  r  r   r  r  r  r  r!  r&  r6  rF  r8   r!   r   <module>rX     s*  , &   	    &   !     0 %    MN 
S 2 '//  %Y__& 4 4n
(** (8 	W^^  G44
"
 
%SP#<<"+c + +htCy>Q +]abe]f +\
"
'19(9,4),X8Tnyx
# $ 9x," ,"\D "C  t  VY F GKW[ik _$ _ _SV _ps _r!   