
    8'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
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l m!Z! ddiZ"d Z# ed      d        Z$ G d dejJ                        Z& e	jN                         Z( G d d      Z)d@dZ*d Z+ G d dejX                        Z-da.da/ G d dej`                        Z1d Z2d Z3d Z4dAd Z5dAd!Z6dAd"Z7dAd#Z8d@d$Z9d% Z:d& Z;d' Z<dAd(Z=d) Z>dBd*ee?   d+e?d,eee?      d-ee?   fd.Z@d/ ZAd0 ZBd1 ZCd2 ZDd3 ZEd4 ZFd5 ZGd6 ZHd7 ZIdCd8ZJd9 ZKd: ZLd;e?d-eMfd<ZNdDd=ZO G d> d?      ZPy)E    )print_functionN)	lru_cachewraps)
getmembers)FunctionType)ListOptional)relativedelta)UnknownTimeZoneError)const   )
_BASE_URL_z
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       J/var/www/html/trade_iq/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__r6    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)r2   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(   r2   s    r   	__enter__zIndentationContext.__enter__U   s    $+,>!$Lt~~$]!r#   c                 J    t         xj                  | j                  z  c_        y r   )rB   r(   r>   )r2   exc_typeexc_valexc_tbs       r   __exit__zIndentationContext.__exit__X   s    !!T^^3!r#   N)r   )r7   r8   r9   r?   rD   rI   r:   r#   r   r<   r<   Q   s    #^4r#   r<   c           	      b    t        t        j                  |       dt        t        dd      i      S rA   )r%   r,   	getLoggerr   rB   )r   s    r   get_indented_loggerrL   \   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 )rL   debugr7   r<   )argsr3   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   )rT   rU   s   ` r   log_indent_decoratorrV   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+)sr   r   )superr?   _researchintgrouplevel_length)r2   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'   r   c              3   (   K   | ]	  }|z     y wr   r:   ).0linepaddings     r   	<genexpr>z,MultiLineFormatter.format.<locals>.<genexpr>   s     BWt^Bs   )rZ   formatr1   lenr_   extendr0   )r2   recordoriginallines	levelname	formattedrg   rb   s         @r   ri   zMultiLineFormatter.formatz   s    7>&)t$!HNN3'*	u:?O q
I  A%I. 1 11sNGBab	BB99Y''r#   )r7   r8   r9   r?   ri   __classcell__)rb   s   @r   rX   rX   p   s    @( (r#   rX   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   ru   rw   rx   )r2   rl   r!   s      r   filterzYFLogFormatter.filter   su    jj68$]]O2cU+C6=)''(3%0C6;'%%&b.C
r#   N)r7   r8   r9   ry   r:   r#   r   rs   rs      s    	r#   rs   c                      t         rt        d      at        S t        2t        j                  d      at        j                  t                      t        S )NrO   )yf_log_indentedrL   	yf_loggerr,   rK   	addFilterrs   r:   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 )NrO   r   z%(levelname)-8s %(message)s)r`   T)r{   r,   rK   r|   setLevelr-   handlersrj   StreamHandlerrX   setFormatter
addHandlerrL   )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])$)boolr[   ra   )strings    r   is_isinr      s    		<fEFFr#   c                 L   t        |       st        d      |xs t        }t         d|  }|j	                  ||t
              }	 |j                         }|j	                  di g      d   }|d   |d   |d   |d	   |d
   d|j	                  dg       dS # t        $ r i cY S w xY w)NzInvalid ISIN numberz/v1/finance/search?q=)urlproxiesheadersquotesr   symbol	shortnamelongname	quoteTypeexchDisp)r   r   r   r   exchangenews)tickerr   )r   
ValueError	_requestsr   getuser_agent_headersjson	Exception)isinproxysessionr   datar   s         r   get_all_by_isinr      s    DM.//"GL-dV
4C;;37I;JDyy{(RD)!, !*#K0":.{+":. HHVR(	
 		
  	s   AB B#"B#c                 `    t        | ||      }|j                  di       j                  dd      S )Nr   r    r   r   r   r   r   r   s       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childrenr   )append)nodelevelchildlevel_detailtemplate_annual_ordertemplate_ordertemplate_ttm_ordertraverses      r   r   z build_template.<locals>.traverse  s     19!!HT%[M":;$$vd5k]%;<e/E"j) +	*+ r#   templater   r:   )r   r   r   r   r   r   r   s     @@@@@r   build_templater      sW     NL+ +$ J a 4nlRRr#   c                 h   g }g }| j                  di       j                         D ]d  \  }}	 |r\d|i}|D ](  }|s|j                  d      ||j                  d      <   * d|v r|j                  |       nd|v r|j                  |       f ||fS # t        $ r}t	        d|        Y d}~d}~ww xY w)	a  
    retrieve_financial_details returns all of the available financial details under the
    "QuoteTimeSeriesStore" for any of the following three yahoo finance webpages:
    "/financials", "/cash-flow" and "/balance-sheet".

    Returns:
        - TTM_dicts: A dictionary full of all of the available Trailing Twelve Month figures, this can easily be converted to a pandas dataframe.
        - Annual_dicts: A dictionary full of all of the available Annual figures, this can easily be converted to a pandas dataframe.
    
timeSeriesr   reportedValueasOfDater   r   z,An error occurred while processing the key: N)r   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   X  s     ##E*J":<<0J!-J~%%z'7'7&HIJF:#5#5tDEJ""u"-J););<AAJr#   stringssepacronymsreturnc           	         t        | t              st        | d      st        d      t	        |       dk(  r| S t        | d   t              st        d      t        |t              rt	        |      dk7  rt        d| d      t        j                  d|      rt        d| d      t        j                  |      |k7  r|d	vrt        d| d
      |;d}d| d}| D cg c]'  }t        j                  |||      j                         ) c}S t        |t              st        |d      rt        |d   t              st        d      |D ]'  }t        j                  d|      rt        d| d       d}d| d}| D cg c]  }t        j                  |||       } }|D ]2  }d| d}d| d}| D cg c]  }t        j                  |||       } }4 | D cg c]  }|j                  |       } }| D cg c]&  }|D cg c]  }||vr|j                         n| c}( } }}| D cg c]  }|j                  |       } }| S c c}w c c}w c c}w c c}w c c}w c c}}w c c}w )N__iter__z<camel2title() 'strings' argument must be iterable of stringsr   r   z camel2title() 'sep' argument = 'z' must be single characterz[a-zA-Z0-9]z' cannot be alpha-numeric>   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   	TypeErrorrj   r   r[   ra   escapesubtitler1   r0   )r   r  r  patrepsajs           r   r   r   i  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  )re   xs     r   rh   z)snake_case_2_camelCase.<locals>.<genexpr>  s     "G1779"Gs   r   )r1   r0   )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                 P   | dk(  rt        d      S | dk(  rt        d      S | dk(  rt        d      S | dk(  rt        d	      S | d
k(  rt        d	      S | dk(  rt        d	      S | dk(  rt        d	      S | dk(  rt        j                  d      S t        j                  |       S )N1mor   )months3mo   6mo   1y)years2y   5yr   10y
   1wk   days)r
   r   	Timedelta)intervals    r   _interval_to_timedeltar9    s    5A&&	U	A&&	U	A&&	T	1%%	T	1%%	T	1%%	U	2&&	U	}}!$$}}X&&r#   c                 X   | j                   }| j                         }|d   |d   z  j                         }|d   |z  |d<   |d   |z  |d<   |d   |z  |d<   |j                  g d	d
d       |j	                  dddddd       ||D cg c]  }||j                   v s| c}   S c c}w )Nr   r   r   Adj Openr   Adj Highr   Adj Low)r   r   r   r   r   Taxisinplace)r;  r<  r=  r   r   r@  )r   copyto_numpydroprenamer   	col_orderdfratiocs        r   auto_adjustrK    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   r;  r   r<  r   r=  )r   r   r   r   r   Tr>  )r;  r<  r=  rA  )r   rB  rD  rE  rF  s        r   back_adjustrM    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highsrV  r   s
             r   parse_quotesrb    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   TrY  r  rW  	DividendscapitalGainsCapital Gainssplits	numeratordenominatorStock Splits)r   r   )
r   r   listvaluesr   r   r   rZ  r   DatetimeIndex)r   re  capital_gainsri  s       r   parse_actionsrq    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)rH  r8  rt  s      r   	set_df_tzrw  2  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)ry  r|  r{  r   r?  )rB  r   r   r   anyrD  )r   r8  tradingPeriodstps_dfidxf_drops         r   'fix_Yahoo_returning_prepost_unrequestedr  9  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(  rD|j                         |j                         k(  r!| j                  | j                  |dz
           } | 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<   | j                  | j                  |dz
           } | S )Nr   r   r/  rs  1dr3  r&  r(  rl  KWFi  d   g      ?g?g{Gz?r   r   r<  r   r=  r   r   r   rf  g      ?)shaper   rt  ru  rv  r   rD  yearweekmonthquarterr   r7  ilocr   prodabslocr   _PRICE_COLNAMES_r   r   isnannanmaxr   nanmin)r   r8  tz_exchangerepaircurrencyndt1dt2last_rows_same_intervalidx1idx2sscurrency_dividerI  rJ  s                  r   !fix_Yahoo_returning_live_separater  U  s   
 	QA1ull1q5!ll1q5!<<??"//%(C//%(Cnn[)nn[)t xxzSXXZ'V\\!a%%89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 merger   zExpected 1 data colr   r5   r  ry  rz  )sider}  rightr5  g        rf  r   r  zAdding out-of-range z @ z in new prices row of NaNs)r   r   T)sort)r  r3  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 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)rf  rh  rl  z?New index contains duplicates but unsure how to aggregate for ''r   r}  )
rj   setr   groupbysumr   r  r   r   rD  )rH  	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   rj   rZ  endswithr9  r   r   r   searchsortedr   r  rD  ranger  	timedeltar~  r   r  r   wherer*   rP   r   r   concatr/   rB  r0   isnar  r  )df_maindf_subr8  rJ  	data_colsdata_colintradaytdindicesr4   r"  f_outOfRangeempty_row_data	empty_rowlast_dtnext_interval_start_dtnext_interval_end_dtr  r  rH  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  1wr3  r            r   )	r   minutehourr   r   arrayr  r   to_timedelta)rH  r8  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#   rt  c                 N    	 t        j                  |        y# t        $ r Y yw xY w)NFT)r  r  r   )rt  s    r   is_valid_timezoner  5  s,    R    s    	$$c                    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)rX  utccurrentTradingPeriod)regularprepostr|  )r|  r{  	gmtoffsetr  r  )r  r  r   r}  r{  r  r  r  	pre_startpre_endr   
post_startpost_end)r  r  r|  r{  r  r  r   )r   dictrj   r]   r   r   rv  rm  r   from_recordsr   hstackrD  r"  rE  r0   r   r   ru  r   )mdtradingPeriodsOnlyrt  kr5   ttpsrH  pre_dfpost_df
regular_dfcolsrJ  s                r   format_history_metadatar  =  s   b$	
2w!|		"	#B8 	VABw2a5,beS)OOBqEFQQRTUBqE	V
 "R'/ B122z"E[B\]^B_`gBhjm7n- qOOB/E,Fq,I!,LSV\`allmop 1215a8q 1215kB1215jAB 2!""b))< I; dD\*#t$]]//

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

3y>8RS
Y/WX]]_ikv^w~]  A!..<PZ1[.\aacmozb{  CDa  E'__j+-FQ_O
Y__V,11': YAOOBqEFIITTUWXBqEYXr'{~~':':;BHxx++B/BH"BHHM#%B Ir#   c                   6    e Zd ZddZd Zd	dZd	dZd Zd Zy)
ProgressBarc                 z    || _         || _        d| _        d| _        d| _        | j                  d       d| _        y )Nz[]*2   r   r   )text
iterationsprog_bar	fill_charwidth_ProgressBar__update_amountelapsed)r2   r  r  s      r   r?   zProgressBar.__init__z  s:    	$
Qr#   c                 <   | j                   | j                  kD  r| j                  | _         | j                  d       t        dt	        |       z   dt
        j                         t
        j                  j                          t        dt
        j                         y )Nr   r   r{  file)r  )r  r  update_iterationr    r/   _sysstderrflushrC   s    r   	completedzProgressBar.completed  sb    <<$//)??DLa dSYBT[[9bt{{#r#   Nc                 "   |"| xj                   dz  c_         | j                   }n| xj                   |z  c_         t        dt        |       z   dt        j                         t        j                  j                          | j                          y )Nr   r  r   r  )r  r    r/   r  r  r  r   )r2   	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  z of r'   )r  floatr  r  r  r  )r2   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  rj   r/   )r2   
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  rC   s    r   __str__zProgressBar.__str__  s    4==!!r#   )r  r   )	r7   r8   r9   r?   r  r  r   r  r  r:   r#   r   r  r  y  s"    $	 N
p"r#   r  r   )NN)r'   N)FN)T)Q
__future__r   r  r  r,   rer[   sysr  	threading	functoolsr   r   inspectr   typesr   typingr   r	   numpyr   pandasr   pytzr  requestsr   dateutil.relativedeltar
   r   rO   r   r   r   r   r"   LoggerAdapterr%   localrB   r<   rL   rV   	FormatterrX   r|   r{   Filterrs   r*   r   r   r   r   r   r   r   r   r   r   r   r   r/   r   r  r$  r9  rK  rM  rb  rq  rw  r  r  r  r  r   r  r  r  r:   r#   r   <module>r+     s  , &      &   !     0 %     MN 
S 2 '//  %Y__& 4 4n
(** (8 	W^^  G.4
"
 
%SP#<<"+c + +htCy>Q +]abe]f +\
"'*9(9,4),X8Tnyx
# $ 9x," ,"r#   