
    h              
          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mZ d d	lmZ d
 Z G d dej                  Z  e	j!                    Z" G d d          Z#dEdZ$d Z% G d dej&                  Z'da(da) G d dej*                  Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2dEdZ3d Z4d Z5d  Z6dFd!Z7d" Z8dGd$ee9         d%e9d&eee9                  d'ee9         fd(Z:d) Z;d* Z<d+ Z=d, Z>d- Z?d. Z@d/ ZAd0 ZBd1 ZCd2 ZDd3 ZEdHd4ZFd5 ZGd6 ZHd7e9d'eIfd8ZJdId:ZK G d; d<          ZLd=eMfd>ZNdEd'e9fd?ZOdJd@eMdAeIdBe9d'e9fdCZPd9dg fd@eMdAeIdBe9d'e9fdDZQdS )K    )print_functionNwraps)
getmembers)FunctionType)ListOptional)relativedelta)UnknownTimeZoneError)constc                      d t          t                               D              fdt                     D             S )Nc                 B    h | ]\  }}t          |t                    |S  )
isinstancer   ).0namevalues      L/var/www/html/marketdash/venv/lib/python3.11/site-packages/yfinance/utils.py	<setcomp>zattributes.<locals>.<setcomp>-   s<     , , ,ue\**,, , ,    c                 r    i | ]3}|d          dk    |vt          |          "|t          |          4S )r   _)hasattrgetattr)r   r   disallowed_namesobjs     r   
<dictcomp>zattributes.<locals>.<dictcomp>0   sY     S S S%)7c>>d*:::wsD?Q?Q: 	gc4  :::r   )r   typedir)r   r   s   `@r   
attributesr    ,   sp    , , *499 5 5, , ,S S S S S-0XXS S S Sr   c                       e Zd Zd ZdS )IndentLoggerAdapterc                 2   t                                          t          j                  rhd| j        d         z  t          |t                    st          |          }d                    fd|                    d          D                       }||fS )N indent
c                     g | ]}|z   S r   r   )r   mis     r   
<listcomp>z/IndentLoggerAdapter.process.<locals>.<listcomp>>   s    <<<qQU<<<r   )	get_yf_loggerisEnabledForloggingDEBUGextrar   strjoinsplit)selfmsgkwargsr)   s      @r   processzIndentLoggerAdapter.process9   s    ??''66 	>dj**Ac3'' #hh))<<<<CIIdOO<<<==CF{r   N)__name__
__module____qualname__r6   r   r   r   r"   r"   8   s#            r   r"   c                   "    e Zd ZddZd Zd ZdS )IndentationContext   c                     || _         d S N)	increment)r3   r?   s     r   __init__zIndentationContext.__init__F   s    "r   c                 V    t          t          dd          | j        z   t          _        d S Nr%   r   )r   _indentation_levelr?   r%   r3   s    r   	__enter__zIndentationContext.__enter__I   s%    $+,>!$L$Lt~$]!!!r   c                 :    t           xj        | j        z  c_        d S r>   )rC   r%   r?   )r3   exc_typeexc_valexc_tbs       r   __exit__zIndentationContext.__exit__L   s    !!T^3!!!!r   N)r<   )r7   r8   r9   r@   rE   rJ   r   r   r   r;   r;   E   sI        # # # #^ ^ ^4 4 4 4 4r   r;   c           	      r    t          t          j        |           dt          t          dd          i          S rB   )r"   r-   	getLoggerr   rC   )r   s    r   get_indented_loggerrM   P   s1    w0667K]_gijCkCk8lmmmr   c                 <     t                      fd            }|S )Nc                      t          d          }|                    dj         d           t                      5   | i |}d d d            n# 1 swxY w Y   |                    dj         d           |S )Nyfinancez	Entering z()zExiting )rM   debugr7   r;   )argsr5   loggerresultfuncs       r   wrapperz%log_indent_decorator.<locals>.wrapperV   s    $Z002222333!! 	+ 	+T4*6**F	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	1111222s   	AAAr   )rU   rV   s   ` r   log_indent_decoratorrW   U   s3    
4[[    [ Nr   c                   (     e Zd Z fdZ fdZ xZS )MultiLineFormatterc                     t                                          |           t          j        d|          }|r"t	          |                    d                    nd| _        d S )Nz%\(levelname\)-(\d+)sr<   r   )superr@   _researchintgrouplevel_length)r3   fmtmatch	__class__s      r   r@   zMultiLineFormatter.__init__h   sW    
3S9938?CA///ar   c                    t                                          |          }|                    d          }|d                             d          d         }t          |          dk    r|S |d         g}| j        dk    rdt          |          z  n
d| j        z  dz  |                    fd|dd          D                        d                    |          S )Nr&   r   r$   r<   c              3   "   K   | ]	}|z   V  
d S r>   r   )r   linepaddings     r   	<genexpr>z,MultiLineFormatter.format.<locals>.<genexpr>|   s'      BBWt^BBBBBBr   )r[   formatr2   lenr`   extendr1   )r3   recordoriginallines	levelname	formattedrg   rc   s         @r   ri   zMultiLineFormatter.formatn   s    77>>&))t$$!HNN3''*	u::??O q
I A%%I. 11sNGBBBBabb	BBBBBB99Y'''r   )r7   r8   r9   r@   ri   __classcell__)rc   s   @r   rY   rY   d   sV        @ @ @ @ @( ( ( ( ( ( ( ( (r   rY   Fc                       e Zd Zd ZdS )YFLogFormatterc                     |j         }t          |d          r|j         d| }t          |d          r|j         d| }t          |d          r|j         d| }||_         dS )Nyf_cat: yf_interval	yf_symbolT)r4   r   ru   rw   rx   )r3   rl   r4   s      r   filterzYFLogFormatter.filter   s    j68$$ 	,]++c++C6=)) 	1'00300C6;'' 	/%....C
tr   N)r7   r8   r9   ry   r   r   r   rs   rs      s#        	 	 	 	 	r   rs   c                      t           rt          d          anAt          :t          j        d          at                              t                                 t          S )NrP   )yf_log_indentedrM   	yf_loggerr-   rL   	addFilterrs   r   r   r   r+   r+      sQ      .'
33				%j11	N,,---r   c                     t           st          j        d          at                              t          j                   t          j        t          t          j                  dk    rRt          j                    } t          d          }| 
                    |           t                              |            t                      ada d S d S )NrP   r   z%(levelname)-8s %(message)s)ra   T)r{   r-   rL   r|   setLevelr.   handlersrj   StreamHandlerrY   setFormatter
addHandlerrM   )h	formatters     r   enable_debug_moder      s      
%j11	7=)))%Y-?)@)@A)E)E%''A*/LMMMINN9%%%  ###'))	
 
r   c                 F    t          t          j        d|                     S )Nz ^([A-Z]{2})([A-Z0-9]{9})([0-9])$)boolr\   rb   )strings    r   is_isinr      s    	<fEEFFFr   c                 |   t          |           st          d          ddlm}  || d          }|j        r|j        d         ni }|j        }|                    dd          |                    dd          |                    d	d          |                    d
d          |                    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   
ValueErrorr]   r   quotesr   get)isinr   r]   r   r   s        r   get_all_by_isinr      s    DMM 0./// V$A...F "(6V]1BF;D jj2..K44

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

:r22
 
 	 	 	r   c                 t    t          |           }|                    di                               dd          S )Nr   r   r   r   r   r   datas     r   get_ticker_by_isinr      s3    4  D88Hb!!%%h333r   c                 L    t          |           }|                    di           S )Nr   r   r   s     r   get_info_by_isinr      s#    4  D88Hb!!!r   c                 L    t          |           }|                    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^    }Msw#'-C -C D D DE EKLr   c                  4    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      s4    M@ @ @A A AE Lr   c                 h    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                 2   |dk    rdS                      d| d                                          d| d                                          | d                                          |           d| v r| d         D ]} ||dz              dS dS )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     199F!!":T%[":":;;;$$%;d5k%;%;<<<e.///E"""j) + +	**** + +r   templater   r   )r   r   r   r   r   r   r   s     @@@@@r   build_templater      s     NL+ + + + + + + + +$ J  a4nlRRr   c                    g }g }|                      di                                           D ]\  }}	 |rjd|i}|D ]0}|s|                     d          ||                     d          <   1d|v r|                    |           nd|v r|                    |           s# t          $ r}t	          d|            Y d}~d}~ww xY w||fS )	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   KeyErrorprint)r   	TTM_dictsAnnual_dictsr   
timeseriestime_series_dicteaches           r   retrieve_financial_detailsr     s-    IL88L"55;;== F FZ	F 	:$+S> & W WD ! =AXXo=V=V$TXXj%9%9::$$$$%56666__ ''(8999 	F 	F 	FDDDEEEEEEEE	Fl""s   A,B  
C*CCc                    t           j                            |                              d          }|                    |          }|j        j                            dd          |_        |r|rt           j                            |                              d                              |          }d |j        D             |_        |j        j                            dd          |_        |	                    |dd          }n|}t          |j        j                  |_        | |d<   |                    |j        dg          }|t          |j        d	                   }|                    d
          }|S )z
    format_annual_financial_statement formats any annual financial statement

    Returns:
        - _statement: A fully formatted annual financial statement in pandas dataframe.
    r   r   r   c                 2    g | ]}d t          |          z   S )zTTM )r0   )r   cols     r   r*   z5format_annual_financial_statement.<locals>.<listcomp>@  s#    @@@SvC(@@@r   r   T)
left_indexright_indexr   reverseallhow)r   r   	from_dict	set_indexreindexr   r0   replacer   mergecamel2titleTsorteddropna)r   annual_dictsannual_order	ttm_dicts	ttm_orderAnnualTTM
_statements           r   !format_annual_financial_statementr   0  sY    ]$$\22<<WEEF^^L))F<#++Ir::FL  Y m%%i00::7CCKKIVV A@CK@@@IM))+r::	\\#$D\II


":<#566J!-J~%%z'7&HIIJF:#5tDDDEJ""u"--Jr   c                 N   |                      |          } t          | j                  | _        || d<   |                     | j        dg          } | t          | j        d                   } |                     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   N  s     ##E**J":<00J!-J~%%z'7&HIIJF:#5tDDDEJ""u"--J);<<AJr   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k    rt          d d          t          j        d          rt          d d          t          j                  k    rd	vrt          d d
          dd dfd| D             S t          t                    s+t          d          rt          d         t                    st          d          D ]*}t          j        d|          st          d| d          +dd dfd| D             } D ]}d| dd dfd| D             } fd| D             } fd| D             } fd| D             } | S )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>   r$   -z' cannot be special characterz([a-z])([A-Z])z\g<1>z\g<2>c                 `    g | ]*}t          j        |                                          +S r   )r\   subtitler   spatreps     r   r*   zcamel2title.<locals>.<listcomp>q  s3    >>>S!$$**,,>>>r   z=camel2title() 'acronyms' argument must be iterable of stringsz^[A-Z]+$zEcamel2title() 'acronyms' argument must only contain upper-case, but 'z
' detectedc                 <    g | ]}t          j        |          S r   r\   r  r  s     r   r*   zcamel2title.<locals>.<listcomp>}  s'    555swsC##555r   (z)([A-Z][a-z])c                 <    g | ]}t          j        |          S r   r  r  s     r   r*   zcamel2title.<locals>.<listcomp>  s'    999A373Q''999r   c                 :    g | ]}|                               S r   )r2   r   r  r   s     r   r*   zcamel2title.<locals>.<listcomp>  s#    ---qwws||---r   c                 ,    g | ]}fd |D             S )c                 D    g | ]}|vr|                                 n|S r   r  )r   jr   s     r   r*   z*camel2title.<locals>.<listcomp>.<listcomp>  s/    AAA!Qh..			AAAAr   r   )r   r  r   s     r   r*   zcamel2title.<locals>.<listcomp>  s.    SSSaAAAAqAAASSSr   c                 :    g | ]}                     |          S r   )r1   r  s     r   r*   zcamel2title.<locals>.<listcomp>  s#    ,,,qsxx{{,,,r   )	r   r0   r   	TypeErrorrj   r   r\   rb   escape)r   r   r   ar  r	  s    `` @@r   r   r   _  s   '3 Xww
'C'C XVWWW
7||qgaj#&& XVWWWc3 ]3s88q==[C[[[\\\
y$$ \ZCZZZ[[[
z###Z"7"7^C^^^___!s!!!>>>>>g>>>> (C   Y*(E(E YZX`abXcehMiMi YWXXX t tyQ'' 	trefrrrsss	t C
3


C55555W555G  : :"!"""!s!!!99999999 .---W---GSSSS7SSSG,,,,G,,,GNr   c                     |                      d          d         d                    d |                      d          dd          D                       z   }|S )Nr   r   r   c              3   >   K   | ]}|                                 V  d S r>   r  )r   xs     r   rh   z)snake_case_2_camelCase.<locals>.<genexpr>  s*      "G"G17799"G"G"G"G"G"Gr   r<   )r2   r1   )r  scs     r   snake_case_2_camelCaser    sM    	
a277"G"Gaggcll1226F"G"G"GGG	GBIr   c                    t          | t                    rt          j        | d|          } n;t          | t                    r-t
          j                            t	          |           d          } t          | t
          j                  rLt          | t
          j                  s2t
          j        	                    | t          j
        d                    } t          | t
          j                  rW| j        (t          j        |                               |          } nJt          j        |                               |          } n"t          d|  dt          |                      | S )Nr  )unittzz%Y-%m-%dr   zUnable to parse input dt z	 of type )r   r^   r   	Timestampr0   	_datetimedatetimestrptimer   combinetimetzinfotz_localize
tz_convertr   r   )dtexchange_tzs     r   _parse_user_dtr+    s2   "c R]2CK888 b# 	B#,,SWWjAABb).)) 	C*RAS2T2T 	C#++B	q0A0ABBBb),-- 	Ry ]2&&22;??]2&&11+>>PPPd2hhPPQQQ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sm"4"45555	"##$		3x}#5#56666	"##$		C"$6$67777	"		3x}#5#56666}X&&&r   c                 R    | dS d}t          t          j        ||                     S )z0Check if the provided period has a valid format.NFz^[1-9]\d*(d|wk|mo|y)$)r   rerb   )periodvalid_patterns     r   is_valid_period_formatr?    s-    ~u -M//000r   c                 h   | j         }|                                 d         d         z                                  }d         |z  d<   d         |z  d<   d         |z  d<                       g d	d
d                               dddddd           fd|D                      S )Nr   r   r   Adj Openr   Adj Highr   Adj Low)r   r   r   r   r<   Taxisinplace)rA  rB  rC  r   r   rF  c                 &    g | ]}|j         v |S r   r   r   cdfs     r   r*   zauto_adjust.<locals>.<listcomp>       777QqBJqr   )r   copyto_numpydroprenamer   	col_orderratiorK  s      @r   auto_adjustrT    s    I	B_r'{*4466EZ%'BzNZ%'BzNuI%ByMGG(((     IIw      
 7777)77788r   c                 B   | j         }|                                 d         d         z  }d         |z  d<   d         |z  d<   d         |z  d<                       g d	d
d                               ddddd           fd|D                      S )z4 back-adjusted data to mimic true historical prices r   r   r   rA  r   rB  r   rC  )r   r   r   r   r<   TrD  )rA  rB  rC  rG  c                 &    g | ]}|j         v |S r   r   rI  s     r   r*   zback_adjust.<locals>.<listcomp>  rL  r   )r   rM  rO  rP  rQ  s      @r   back_adjustrW    s     I	B{Obk)EZ%'BzNZ%'BzNuI%ByMGG,,,     II      
 7777)77788r   c           	      r   | d         }| d         d         d         }|d         }|d         }|d         }|d         }|d	         }|}d
| d         v r| d         d
         d         d
         }t          j        ||||||d          }	t          j        |d          |	_        |	                    d           |	S )N	timestamp
indicatorsquoter   volumeopencloselowhighadjcloser   r  r  TrF  )r   r   r   r   
sort_index)
r   
timestampsohlcvolumesopenscloseslowshighsra  r   s
             r   parse_quotesrl    s    k"Jg&q)D8nGLE']F;DLEHT,'''%j1!4Z@]E$)#'%+)1&-/ / 0 0F ?:C888FL
d###Mr   c                 `   d }d }d }d| v rd| d         v rt          | d         d                   dk    rt          j        t          | d         d                                                             }|                    dd           t          j        |j        d	          |_        |                    d           d
|j	        v r5|d
         dk    
                                r|                    d
d          }|                    ddi          }d| d         v rt          | d         d                   dk    rt          j        t          | d         d                                                             }|                    dd           t          j        |j        d	          |_        |                    d           dg|_	        d| d         v rt          | d         d                   dk    rt          j        t          | d         d                                                             }|                    dd           t          j        |j        d	          |_        |                    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   Trc  r  rb  currencyr   r<   rE  amount	Dividendsr   capitalGainsCapital Gainssplits	numeratordenominatorStock Splits)r   r   )rj   r   r   listvaluesr   r   r   rd  r   r   rO  rP  DatetimeIndex)r   ro  capital_gainsrv  s       r   parse_actionsr~    sK   IMF4$x.((Sh1L-M-MPQ-Q-Q$x.5<<>>??A A AI555!oioCHHHIO   ...Y...Ij4IR4O3T3T3V3V.%NN:AN>>	!(((K1H(IIIT(^++DN>4R0S0SVW0W0WM$x.8??AABBD D DM##FD#999"%/-2EC"P"P"PM$$T$222%4$5M!tH~%%#d8nX.F*G*G!*K*K]$x.299;;<<> > >FVT222?6<cBBBFLd+++%+K%86-;P%PF>"^,-FM M):2)>)>@ @ @	$%S->r-B-BD D D~#$C,=b,A,AC C C fm++r   c                     | j         j        | j                             d          | _         | j                             |          | _         | S )NUTC)r   r  r'  r(  )rK  r9  r  s      r   	set_df_tzr  0  s?    	x{8''..x""2&&BHIr   c                    |                                 }|j        j        |d<   | j        j        | d<   | j                                         }|                     |d          } || _        | j        | d         k    }|| j        | d         k     z  }|                                r	| |          } |                     g dd          } | S )	N_dateleftr   endstart)r  r  r  r<   rq  )rM  r   r   r   anyrO  )r   r9  tradingPeriodstps_dfidxf_drops         r   'fix_Yahoo_returning_prepost_unrequestedr  7  s       ""Fl'F7Ol'F7O
,



C\\&f\--FFL\VE]*Fv|fWo56Fzz|| ! [[222[;;FMr   c                    |dk    r+|                                  |                                 k    }n|dk    r|| z
  j        dk     }n|dk    r| j        |j        k    }nu|dk    rT| 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    }n|| z
  t	          j        |          k     }|S )
N1d1wk   1mo3mo   r<      r   )r   r0  monthyearr   r8  )	dt1dt2r9  last_rows_same_intervalshiftq1q2	year_diffquarter_diffs	            r   _dts_in_same_intervalr  S  s    4"%((**

":	U		#&9"2Q"6	U		"%)sy"8	U		Q!#i%!#)A-i%!#)A-Hsx'	Bw9,".!"3#&9h0G0G"G""r   c                 
   |d         dvrd}d }t          |           dk    r| j        d         }| j        d         }| j        j        *|                    d          }|                    d          }|                    |          }|                    |          }|dk    ri|                                |                                k    r=| j        d         }t          j        | j        d d         | j        dd          g          } nt          |||          r| j        d         }	| j        d         }
|	|
k    r| d fS |r|j
        dk    r| d fS | d	         j        dd                              dd                                          }|r|d
k    rd}nd}t          ||z  dz
            dk    r| j        |	t          j        f         | j        |
t          j        f         z  }||z  dz
                                  dk                                     r't          j        D ]}| j        |
|fxx         dz  cc<   nV||z  dz
                                  dk                                     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 rBt%          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 rBt%          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k    r|| j        |
d	f<   | j        d         }|                     | j        d                   } | |fS )Nr-  )r(   r   Fr<   r1  r  r  r   ry  KWFi  d   g      ?g?g{Gz?r   r   rB  r   rC  r   r   r   rs  g      ?)rj   r   r  r'  r(  r   ilocr   concatr  secondr   prodabslocr   _PRICE_COLNAMES_r   r   isnannanmaxr   nanminrO  )r   r9  tz_exchangeprepostrepairrp  dropped_rowr  r  idx1idx2sscurrency_dividerS  rJ  s                  r   !fix_Yahoo_returning_live_separater  h  s*    |:%%K
6{{Ql2l2<?"//%((C//%((Cnn[))nn[))t xxzzSXXZZ''$k"oV["%5v{2337G$HII$S#x88 97|B'|B'4<< "4<' ,zQ%t|+N+05==aBBGGII <  5((*.*-2o-a/00477 &
41G+G H6:VZ\a\rVrKs s"?21499;;dBGGII <%*%; ; ; &
47 3 3 3s : 3 3 3 3;#O3A5::<<tCHHJJ <%*%; < < &
47 3 3 3t ; 3 3 3 39VZf566 G/5f~/B2/FFJtV|,y!4R!899 ~/2z6&>;Nr;RTZ[aTbTghjTk:l/m/mFJtV|,!V^337:z6*CUCZ[]C^`fgq`r`wxz`{B|7}7}
4#34y!3B!788 {.1j&-:LR:PRXY^R_RdegRh9i.j.jFJtU{+ FN2269j&BSBXY[B\^den^o^tuw^xAy6z6z
4?3,27O,@,D
4=)&.004:;4G4LR4PFJt[01
4>***fX.>.CB.GG***
4,---1D1I"1MM---9979FJt^34$k"oV\"%566;r   c           	      J    |j         rt          d           j         r S  fd|j        D             }t          |          dk    rt          d          |d         }                                  |                    d          p|                    d          }t          |          }|r j        j         d<   |j        j        |d<   t          j
        t          j         d          d         j        d	         |z   g          |d         d
          }                     dd           |                    dd          }nGt          j
        t          j         j         j        d	         |z             |j        d          }|dz  }|rt          t          |j                            D ]}|j        |                                         }	|	 j        d                                         k     s9|	 j        d	                                         t          j        d          z   k    rd	||<   n[t          t          |j                            D ]9}|j        |         }	|	 j        d         k     s|	 j        d	         |z   k    rd	||<   :|d	k    }
|
                                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
          }                     dd           |                    dd          }n'i d t$          j        D             ddgi}|dk    rt          j        |
          d         D ]x}|j        |         }	t+                                          d| d|	                                 d           t/          j        ||	g          }t/          j         |gd           yn j        d	         }||z   }||z   }t          j        |
          d         D ]}|j        |         }	||	cxk    r|k     rln t+                                          d| d|	                                 d           t/          j        ||	g          }t/          j         |gd                                             t          j
        t          j         j         j        d	         |z             |j        d          }|dz  }t          t          |j                            D ]9}|j        |         }	|	 j        d         k     s|	 j        d	         |z   k    rd	||<   :|d	k    }
|
                                r|s|dv r#t          d| d| d|j        |
                    t+                                          d| dd z   t5          ||
                   z              ||
                                          }||
          }d! } j        |         } ||||          }                     |          }||                                         }t=          |           |j        d         k     }|rt          d"          |S )#NzNo data to mergec                     g | ]}|v|	S r   r   )r   rJ  df_mains     r   r*   z"safe_merge_dfs.<locals>.<listcomp>  s#    ???qaw.>.>.>.>.>r   r<   zExpected 1 data colr   r(   r  r  r-  r  )siderq  rightr/  g        rs  c                 *    i | ]}|t           j        gS r   )r   r   )r   rJ  s     r   r   z"safe_merge_dfs.<locals>.<dictcomp>  s     M M MCG9 M M Mr   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 rv   zDiscarding these z events:r&   c                    t          |          t          t          |                    k    r	|| _        | S || d<   |dv r4|                     d                                          } d | j        _        nM|dk    r4|                     d                                          } d | j        _        nt          d| d          d| j        v r| 	                    dd          } | S )N	_NewIndex)rs  ru  ry  z?New index contains duplicates but unsure how to aggregate for ''r<   rq  )
rj   setr   groupbysumr   r  	Exceptionr   rO  )rK  	new_indexdata_col_names      r   _reindex_eventsz'safe_merge_dfs.<locals>._reindex_events!  s    y>>SY0000 BHI#;:::K((,,..B BHMMn,,K((--//B BHMMn^knnnooo"*$$1--B	r   z#Data was lost in merge, investigate) r   r  r   rj   rd  endswithr:  r   r   r   searchsortedr   r  rO  ranger!  	timedeltar  r   r  wherer+   rQ   r   r   r  r0   rM  r1   isnar  shape)r  df_subr9  	data_colsdata_colintradaytdindicesr)   r)  f_outOfRangeempty_row_data	empty_rowlast_dtnext_interval_start_dtnext_interval_end_dtr  r  rK  f_na	data_losts   `                    r   safe_merge_dfsr    sF   | ,*+++} ????FN???I
9~~-...|H  ""G  %%?):):3)?)?H		)	)B  #=- ,+w"3:gg.>AQAVWYAZ[]A]@^#_#_aghoapw}~~~,,wQ,//W1--"3:gmW]2=NQS=S#T#TV\Vbipqqq1  s6<(()) 	  	 Aa%%''BGM!$))++++rW]25F5K5K5M5MPYPcijPkPkPk5k/k/k
		  s6<(()) 	  	 AaBGM!$$$gmB.?".D(D(D
b=L -$ ,	$\M*F| '*$  '}1GG$l/F7O&sz''2BWWEUEZ[]E^_aEaDb'c'ceklset  |B  C  C  CGll7l33G[[q[11FF\ M Me6L M M M\xYZX[\\N4<003 J JAaB!OO))*s*s*sbggii*s*s*sttt #>" N N NI!j'9)=DIIIGG	J "-+)02&'='B$<003 N NAaB-JJJJ6JJJJJJ%--.wX.w.wRTRYRYR[R[.w.w.wxxx$'M~bT$R$R$R	"%*gy-A"M"M"M((**G &sz'-rARUWAW'X'XZ`ZfmtuuuGqLG3v|,,-- $ $\!_a(((B'-2Cb2H,H,H!#GAJb=L ) 	Zx=00  Yh  Y  Ypx  Y  Y  }C  }I  JV  }W  Y  Y  Z  Z  ZD(DDDtKcRXYeRfNgNgghhh&++--<-(  , g&I_VY99F	f		Bh<DTE

V\!_,I ?=>>>Ir   c                 .   |dv r| j         j        dk    | 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)rK  r9  f_pre_midnightdst_error_hourss       r   fix_Yahoo_dst_issuer  C  s    &&&
 (/Q.28=3E3Er2h3O3OP)QC"(1+$566*,rx/G/L*L'
C$_c:::Ir   r  c                 T    	 t          j        |            n# t          $ r Y dS w xY wdS )NFT)_tztimezoner   )r  s    r   is_valid_timezoner  P  sA    R   uu4s    
%%Tc                    t          | t                    s| S t          |           dk    r| S | d         }|sdD ]\}|| v rV| |         Nt          | |         t                    r3t	          j        | |         dd                              |          | |<   ]d| v rdD ]}|| d         v rt          | d         |         d	         t                    rnd
D ]M}t	          j        | d         |         |         dd                              |          | d         |         |<   N| d         |         d= | d         |         d= d| v r| d         }|g g dk    rnt          |t          t          f          rt          |t                    rt          j        	                    t          j        |                    }|                    ddgd          }t	          j        |d	         dd          j                            |          |d	<   t	          j        |d         dd          j                            |          |d<   nt          |t                    rt          j        	                    t          j        |d                             }t          j        	                    t          j        |d                             }	t          j        	                    t          j        |d                             }
|                    ddd
                              ddgd          }|	                    ddd
                              ddgd          }	|
                    ddgd          }
g d}|
                    |                              |	          }|D ]:}t	          j        ||         dd          j                            |          ||<   ;||         }t	          j        |d	         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<   rq  r  r  r  r  	pre_startpre_endr   
post_startpost_end)r  r  r  r  r  r  r   )r   dictrj   r^   r   r   r(  rz  r   from_recordsr   hstackrO  r)  rP  r1   r   r   r'  r   )mdtradingPeriodsOnlyr  kr(   ttpsrK  pre_dfpost_df
regular_dfcolsrJ  s                r   format_history_metadatar  X  s<   b$ 	
2ww!||		"	#B B8 	V 	VABww2a5,beS)) VOBqEFFFQQRTUUBqE!R''/ B B1222z"E[B\]^B_`gBhjm7n7n2- q qOB/E,Fq,I!,LSV\`aaallmopp 1215a881215kB1215jA2!""b))))dD\** 	&#t$$ ]//
3@@WWj+6QW??!obkNNNQ\\]_``7OBuICTJJJMXXY[\\5		C&& 33CJs5z4J4JKK-44SZF5L5LMM ]77
3y>8R8RSS
Y/W/WXX]]_ikv^w~]  A  A!..<PZ1[1[.\\aacmozb{  CDa  E  E'__j+-FQ_OO
YYY__V,,11':: Y YAOBqEFFFITTUWXXBqEEXr'{~':;;BHx++B//BH"BHM#%B Ir   c                   8    e Zd Zd	dZd Zd
dZd
dZd Zd ZdS )ProgressBar	completedc                     || _         || _        d| _        d| _        d| _        |                     d           d| _        d S )Nz[]*2   r   r<   )text
iterationsprog_bar	fill_charwidth_ProgressBar__update_amountelapsed)r3   r  r  s      r   r@   zProgressBar.__init__  sD    	$
Qr   c                 2   | j         | j        k    r| j        | _         |                     d           t          dt	          |           z   dt
          j                   t
          j                                         t          dt
          j                   d S )Nr<   r   r  file)r  )r  r  update_iterationr   r0   _sysstderrflushrD   s    r   r
  zProgressBar.completed  s    <$/))?DLa   dSYYBT[9999bt{######r   Nc                    || xj         dz  c_         | j         }n| xj         |z  c_         t          dt          |           z   dt          j                   t          j                                         |                                  d S )Nr<   r  r   r  )r  r   r0   r  r  r  r  )r3   	iterations     r   animatezProgressBar.animate  s    LLALLIILLI%LLdSYYBT[9999r   c                     ||n| j         t          | j                  z  }|                     |dz             | xj        d| j          d| j         d| j         z  c_        d S )N      Y@  z of r$   )r  floatr  r  r  r  )r3   vals     r   r  zProgressBar.update_iteration  sk    _cc$,t9O9O*OS5[)))MdlMMMM$)M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   | _        d S )Nr!     [r$   ]%r   )r^   roundr  r  r  rj   r0   )r3   
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ABB
dnz99C8jCX<YY\__''1,C4E4E0F0FF	$'''
a	k2j4=QZ]`ak]l]lQlQmQmCn6nor   c                 *    t          | j                  S r>   )r0   r  rD   s    r   __str__zProgressBar.__str__  s    4=!!!r   )r
  r>   )	r7   r8   r9   r@   r
  r  r  r  r3  r   r   r   r	  r	    s           $ $ $	  	  	  	 N N N N
p p 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         rB| j         }                                D ]\  }}|                    d| d|          } || _         | S )N{})__doc__r   r   )rU   	docstringr   r   r4  s       r   	decoratorz$dynamic_docstring.<locals>.decorator  s`    < 	%I*0022 C C
U%--l3lllEBB		$DLr   r   )r4  r;  s   ` r   dynamic_docstringr<    s$         r   c                 H    dd l }| d} |                    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_configurationsrA    sF    OOO}'OO    	 	E Lr   r   bulletsr  c                 z   t          |          }t          |                                           D ]}| |         }|dd| dz   z  }d |D             }|r7t          |          dk    r$|dz  }t          |          D ]}|dd| dz   z  }[d	                    t          |                    }|d
d| dz   z  }|S )P
    Generate a list-table for the docstring showing permitted keys/values.
       * - r&   c                 F    g | ]}t          t          |                    S r   rj   r0   r   vs     r   r*   z1generate_list_table_from_dict.<locals>.<listcomp>  s$    ///13s1vv;;///r   r        -
       - ,      )rA  r   keysmaxr1   )	r   rB  r  r@  r   r{  lengthsr   	value_strs	            r   generate_list_table_from_dictrT    s     +511EDIIKK   
0 
0a%%///// 	0s7||a'']"E 0 0e//0 		&..11IU/)/////EELr   c           	      p   t          |          }|                                 D ]}| |         }|dd| dz   z  }t          |t                    rod}||v }|rSt	          t          |                                                    }	d}
d|	v }t          t          |	                    D ]}|	|         }||         }d}t          |t                    rt          |          }n*t          |t                    rt          |          dk    rg }t          |t
                    rMt	          |          }t          d |D                       }|r#t          j        d	dt          |                    }|t          |          }t          |
          dk    r-t          |
          t          |          z   d
k    r
||
dz   z  }d}
|r4|
dk    r|
dz  }
|dk    r|
dz  }
n|
dz  }
|
dz  }
n|
dz  }
|
| d|z   z  }
M|dz  }|dk    r|dz  }n|dz  }d|v rn|d| dz   dz   z  }|                    d          }t          t          |                    D ]-}||         }|d|z   z  }|t          |          dz
  k     r|dz  }.n|r|dz  }n|dz  }|| d|z   z  }|dz  }|
dk    r||
dz   z  }n|dd| dz   z  }||z  }d |D             }|r8t          |          dk    r%|dz  }t	          |          D ]}|dd| dz   z  }d                    t	          |                    }|dd| dz   z  }|S )rD  rE  rF  r&   r   r   Nr   c              3   Z   K   | ]&}t          |t          t          t          f          V  'd S r>   )r   r^   r#  r0   )r   k2vs     r   rh   z:generate_list_table_from_dict_universal.<locals>.<genexpr>!  s4      (a(aPSC#uc9J)K)K(a(a(a(a(a(ar   z	[{}\[\]'](   rO  rM  r"  z| z.  rv   z       |     r<   z* c                 F    g | ]}t          t          |                    S r   rH  rI  s     r   r*   z;generate_list_table_from_dict_universal.<locals>.<listcomp>[  s$    333qs3q66{{333r   r   rK  rL  rN  )rA  rP  r   r  r   rz  r  rj   r  r   r\   r  r0   r2   rQ  r1   )r   rB  r  concat_keysr@  r   r{  	table_addconcat_short_linesk_keyscurrent_lineblock_formatr)   k2	k2_valuesk2_values_str
all_scalark2_values_str_linesr  rf   rR  r   rS  s                          r   'generate_list_table_from_dict_universalre    s%    +511EYY[[ X4 X4a%%fd## T	4I!"k!1 C5V[[]] 3 344!&&0s6{{++ ;* ;*AB &r
I$(M!)S11 '$(OO		#It44 'Y19L9L$&	!)T22 V$*9$5$5	%((a(aW`(a(a(a%a%a
% V,/GL"c)nn,U,UM$,(+I<((1,,#l2C2Cc-FXFX2X[]2]2]!\D%88	')) %*'2--(E1L Avv , 4 , 4(D0LL(E1L$2			M(AA!U*	66%-II%-I=00%2			)9D)@@I2?2E2Ed2K2K/%*3/B+C+C%D%D 6 6':1'= )-@4-G G	#$s+>'?'?'A#A#A$-$5I	6  , 2 )T 1		 )T 1	%B])BBI!T)		2%%!44IU_&___44	YEE 43F333G 43w<<!++&#F^^ 4 4EU^%^^^33EE4 !IIfVnn55	!3i!3!3!333Lr   r>   )NN)r$   N)FN)T)TN)R
__future__r   r"  r!  r-   r<  r\   sysr  	threading	functoolsr   inspectr   typesr   typingr   r	   numpyr   pandasr   pytzr  dateutil.relativedeltar
   r   rP   r   r    LoggerAdapterr"   localrC   r;   rM   rW   	FormatterrY   r|   r{   Filterrs   r+   r   r   r   r   r   r   r   r   r   r   r   r   r0   r   r  r+  r:  r?  rT  rW  rl  r~  r  r  r  r  r  r  r   r  r  r	  r  r<  rA  rT  re  r   r   r   <module>ru     s2  , & % % % % %      				                               ! ! ! ! ! ! ! !             0 0 0 0 0 0 % % % % % %      S S S    '/    %Y_&& 4 4 4 4 4 4 4 4n n n n
  ( ( ( ( (* ( ( (8 	    W^        G G G  24 4 4
" " "
     
     %S %S %SP# # #<   <  "+ +c + +htCy>Q +]abe]f + + + +\  
  (
' 
' 
'1 1 19 9 9(9 9 9,  4,, ,, ,,^    8# # #*U U U Up@ @ @F
 
 
# $    9 9 9 9x," ," ," ," ," ," ," ,"\D    " C      t  VY    F GKW[ik _ _$ _ _SV _ps _ _ _ _ _ _r   