
    U>qj)                        d dl mZ 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Zd dlZd dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZmZmZ  G d d	      Z y)
    )new_session)iscloseN)utils)YfConfig)
_BASE_URL__PRICE_COLNAMES_period_default
_SENTINEL_)YFDataExceptionYFInvalidPeriodErrorYFPricesMissingErrorYFRateLimitErrorYFTzMissingErrorc                      e Zd ZddZej
                  eddddddddddddfdej                  fd       Z	ddej                  fd	Z
efdefd
Zddej                  fdZddej                  fdZddej                  fdZddej                  fdZddej                  fdZej
                  dd       Zd Zd dZej
                  d        Zej
                  d        Zej
                  d        Zej
                  d        Zej
                  d        Zej
                  d        Zej
                  d        Zej
                  d!d       Zy)"PriceHistoryNc                     || _         |j                         | _        || _        |xs
 t	               | _        i | _        d | _        d| _        d | _	        d | _
        d | _        d | _        d | _        y )NF)_datauppertickertzr   session_history_cache_history_metadata_history_metadata_formatted
_dividends_splits_capital_gains_reconstruct_start_interval_last_error)selfdatar   r   r   s        X/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/yfinance/scrapers/history.py__init__zPriceHistory.__init__   sk    
lln/+- !%+0(" ,0(    1dFT
   returnc           
      -   t        j                         }|rt        j                  dt        d       |}|t
        k(  rd}|s|rd}nd}n|}|	ro|dv rj|dk(  rt        d      |U|R|O| j                  }|}t        | j                        }t        |      }|j                  d	d
      d
   | _        |st        j                  j                  s||j!                  |       t        j"                         S |dk(  rNt%        j&                  t(        j*                  j-                  d      j/                  |      j0                  d
d
      }nmt(        j*                  j-                  d      j/                  |      j'                         }|t        j2                  |      z  }|t%        j4                  d      z  }|}d}d}|}|}|s|s|r|j7                         dk(  r| j                  }|}t        | j                        }t        |      }|j                  d	d
      d
   | _        |st        j                  j                  s||j!                  |       t        j"                         S |r/t        j8                  |      }t;        |j=                               }|r/t        j8                  |      }t;        |j=                               }||s|sd}nH|s3t        j2                  d      z
  }t;        |j=                               }n|st(        j*                  j-                  d      j/                        }t;        |j=                               }n|j7                         dk(  rK|t;        t?        j@                               }||dk(  r|dz
  }n|dv r|dz
  }n|dv r|dz
  }n|dz
  }|dz  }nj|r|rt        d      |s|rWt        j2                  |      }||z   }t;        |j=                               }||z
  }t;        |j=                               }d}|s|r||d}n|j7                         }d|i}|j7                         |d<   ||d<   |d   dk(  rd|d<   d|d <   tC        |      }| j                  }dD ]K  }||v st        t)        j*                  ||   d!"      jE                  d      j/                  |            ||<   M |j                  | j                   d#t        |              tF         d$| j                   }d}| jH                  jJ                  }|yt)        j*                  |d!"      jE                  d      }t(        j*                  j-                  d      }t%        j4                  d%&      } || z   |k  r| jH                  jL                  }	  ||||'      }d(|jN                  v s|tQ        d)      |jS                         }	 |xs i jK                  d*      xs i }!|!jK                  d+      }"tY        |"tZ              r-t]        |"      d,kD  r|"d,   xs i }#|#jK                  d-      xs i }$ni }$|$| _/        |	| j^                  d.<   |d   d/   d0v }%d1}&|s||j7                         dk(  r0|&d2|d    d3z  }&||&| z  }&n|%sH|&t)        j*                  |d!"      jE                  d      j/                  |      j'                          z  }&n9|&t)        j*                  |d!"      jE                  d      j/                  |       z  }&|&d4z  }&|	|&| d5z  }&n|%sJ|&t)        j*                  |d!"      jE                  d      j/                  |      j'                          d5z  }&nE|&t)        j*                  |d!"      jE                  d      j/                  |       d5z  }&n	|&d6| d5z  }&d7}'|tY        |tB              sta        | j                  |&      }d8}'ntY        |tB              r)d9|v r%|&d:|d9    d5z  }&ta        | j                  |&      }d8}'nd*|v r:|d*   r5|d*   d;   r-|&d<|d*   d;   d=   z   d>z   z  }&ta        | j                  |&      }d8}'nd*|vs)|d*   r$|d*   d+   |d*   d+   r|d*   d+   d,   d?   d@   d,   sta        | j                  |&      }d8}'n]|r[|| j^                  dA   vrJt        jb                  |      s5te        | j                  |dBjg                  | j^                  dA               }d8}'|'rt              }|j                  d	d
      d
   | _        |st        j                  j                  s||j!                  |       | jh                  | jh                  |k(  rd| _4        t        j"                         S | j^                  dC   }(|(dDv })| j^                  dE   }*| j^                  dF   }+|r|| j^                  jK                  dAg       vrt;        t?        j@                               }t)        j*                  |d!"      jE                  d      }t$        j&                  jk                  |      }|t        j2                  |      z  }|t%        j4                  d      z  }t        jl                  |d*   d+   d,         },|rZ|,jn                  sN|,jp                  d/   j/                  d      jE                  d      k\  r|,js                  |,jp                  d/         },|,jn                  r| j                   dG}-n\t]        |,      d
k(  r | j                   dH|,jp                  d,    dI}-n.| j                   dH|,jp                  d,    d4|,jp                  d/    }-|j                  |-       |j7                         dk(  r|j                  | j                   dJ       |,ju                  dK      }.t)        jv                  |.jy                         jp                  |.dL   j{                         |.dM   j}                         |.dN   j                         |.dO   jy                         |.dP   jy                         |.dQ   j                         dRS      },t        j                  |,||*      },t        j                  |,|      },|d   d/   d0v }%|s|%rdT| j^                  v r|| j^                  dT   }/tY        |/t(        jv                        s<t        j                  | j^                  d8U      | _/        d8| _D        | j^                  dT   }/t        j                  |,||/      },|,jn                  r| j                   dV}-n\t]        |,      d
k(  r | j                   dW|,jp                  d,    dI}-n.| j                   dW|,jp                  d,    d4|,jp                  d/    }-|j                  |-       t        j                  |d*   d+   d,         \  }0}1}2|)sd}2|11t        j                  |1||*      }1|1dX   j                  dY      | _H        nt)        j                         | _H        |0t        j                  |0||*      }0dF|0j                  v ro|0j                  dY      | _K        | j^                  dF   }3|3d1}3|0dF   |3k7  }4|4j                         r|	r|3d1k7  r| j                  |0|3|	      }0|0js                  dFd
Z      }0n3|0d[   j                  dY      | _K        nt)        j                         | _K        |21t        j                  |2||*      }2|2d\   j                  dY      | _N        nt)        j                         | _N        |]|,jn                  sQ|,jp                  d,   j                  d]      }5|0|0j                  |5d }0|2|2j                  |5d }2|1|1j                  |5d }1|-t)        j                  d
      z
  }6|0|0d|6 }0|2|2d|6 }2|1|1d|6 }1|d   d/   d0v }%|%st)        j                  |,jp                  j&                        jE                  |*d8d^_      |,_8        |0j                  d,   d,kD  r@t)        j                  |0jp                  j&                        jE                  |*d8d^_      |0_8        |1j                  d,   d,kD  r@t)        j                  |1jp                  j&                        jE                  |*d8d^_      |1_8        |,j                         }7|0j                  d,   d,kD  rt        j                  |7|0|      }7d[|7j                  v r#d,|7j                  |7d[   j                         d[f<   nd`|7d[<   |1j                  d,   d,kD  rt        j                  |7|1|      }7dX|7j                  v r#d,|7j                  |7dX   j                         dXf<   nd`|7dX<   |)r_|2j                  d,   d,kD  rt        j                  |7|2|      }7d\|7j                  v r#d,|7j                  |7d\   j                         d\f<   nd`|7d\<   |7jn                  r| j                   da}-n\t]        |7      d
k(  r | j                   db|7jp                  d,    dI}-n.| j                   db|7jp                  d,    d4|7jp                  d/    }-|j                  |-       t        j                  |7|d   |*||	|+c      \  }7}8|8|8dO   |8j                  dd| j^                  de<   |7|7jp                  j                  dfg          }7|	ri|j                  | j                   dh       |7j                         }7| j                  |7|+      \  }7}+|+| j^                  dF<   |7dQ   j                         }9|9j                         rd,|7j                  |9dQf<   | j                  |7|||+      }7|7jn                  sg| j                  |7j                  d/d ||*|      }:di|7j                  vrd7|7di<   t)        j                  |7js                  |7jp                  d/         |:g      }7| j                  |7||*|      }7| j                  |7||*      }7| j                  |7||*|      }7| j                  |7      }7|7j                         }7	 |rt        j                  |7      }7n|rt        j                  |7      }7|r%t        j                  |7|d*   d+   d,   d-   dl         }7|7dQ   j                  d,      j                  t        j                        |7dQ<   |%rdm|7jp                  _X        ndY|7jp                  _X        |s|7js                  g dndop      }7|
swt        dQgz   g dnz   }<|<D =cg c]  }=|=|7j                  v s|= }<}=|7|<   j                         |7|<   d,k(  z  j                  d
Z      }>|7js                  |>jp                  |>         }7||k7  r| j                  |7|||      }7|7jn                  r| j                   dq}-n\t]        |7      d
k(  r | j                   dr|7jp                  d,    dI}-n.| j                   dr|7jp                  d,    d4|7jp                  d/    }-|j                  |-       |7j                         }7| jh                  | jh                  |k(  rd| _4        |7S # tT        $ r  tV        $ r! |st        j                  j                  s Y w xY w# tV        $ r i }$Y ?w xY w# tV        $ r\};|st        j                  j                  s |rdj|;z  }ndk|;z  }|| _        |j!                  | j                  d	|       Y d};~;d};~;ww xY wc c}=w )saJ  
        :Parameters:
            period : str
              | Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
              | Default: '1mo' if start & end None
              | Can combine with start/end e.g. end = start + period
            interval : str
              | Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
              | Intraday data cannot extend last 60 days
            start : str
              | Download start date string (YYYY-MM-DD) or _datetime, inclusive.
              | Default: 99 years ago
              | E.g. for start="2020-01-01", first data point = "2020-01-01"
            end : str
              | Download end date string (YYYY-MM-DD) or _datetime, exclusive.
              | Default: now
              | E.g. for end="2023-01-01", last data point = "2022-12-31"
            prepost : bool
              | Include Pre and Post market data in results?
              | Default: False
            auto_adjust : bool
              | Adjust all OHLC automatically?
              | Default: True
            back_adjust : bool
              | Back-adjusted data to mimic true historical prices
            repair : bool
              | Fixes price errors in Yahoo data: 100x, missing, bad dividend adjust.
              | Default: False
              | Full details at: :doc:`../advanced/price_repair`.
            keepna : bool
              | Keep NaN rows returned by Yahoo?
              | Default: False
            rounding : bool
              | Optional: Round values to 2 decimal places?
              | Default: False = use precision suggested by Yahoo!
            timeout : None or float
              | Optional: timeout fetches after N seconds
              | Default: 10 seconds
            raise_errors : bool
                If True, then raise errors as Exceptions instead of logging.
        zF'raise_errors' deprecated, do: yf.config.debug.hide_exceptions = False   )
stacklevelN1mo)5d1wkr+   3mor,   z<Yahoo's interval '5d' is nonsense, not supported with repair:    ytdUTC   daysr%   max1mi 
 )2m5m15m30m90mi O )1h60mi gl   j-t zASetting period, start and end is nonsense. Set maximum 2 of them.)period1period2rangeintervalincludePrePostr;   r:   zdiv,splits,capitalGainseventss)unitz: Yahoo GET parameters: z/v8/finance/chart/   )minutes)urlparamstimeoutzWill be right backz)*** YAHOO! FINANCE IS CURRENTLY DOWN! ***chartresultr   meta
YF repair?mh  (  -> )z	 (period=FTstatus_codez(Yahoo status_code = errorz (Yahoo error = "descriptionz")
indicatorsquotevalidRanges, instrumentType)
MUTUALFUNDETFexchangeTimezoneNamecurrencyz$: yfinance received OHLC data: EMPTYz: yfinance received OHLC data: z onlyz: resampling 30m OHLC from 15m30minOpenHighLowClose	Adj CloseVolume)rf   rg   rh   ri   rj   rk   )indexr!   tradingPeriods)tradingPeriodsOnlyz: OHLC after cleaning: EMPTYz: OHLC after cleaning: Stock SplitsDateaxis	DividendsCapital GainsDshift_forward)	ambiguousnonexistent        z$: OHLC after combining events: EMPTYz: OHLC after combining events: )repairrd   )PriceTime	lastTradefirst)keepz: checking OHLC for repairs ...	Repaired?zauto_adjust failed with %szback_adjust failed with %s	priceHintDatetimers   ro   rt   ignore)columnserrorsz : yfinance returning OHLC: EMPTYz: yfinance returning OHLC: )mr   get_yf_loggerwarningswarnDeprecationWarningr	   
ValueErrorr   r   r   strsplitr   r   debughide_exceptionsrZ   empty_df	_datetimedatepd	Timestampnow
tz_convertyear_interval_to_timedelta	timedeltalower_parse_user_dtint	timestamp_timetimedicttz_localizer   r   get	cache_gettextr   jsonr   	Exception
isinstancelistlenr   r   is_valid_period_formatr   joinr   fromtimestampparse_quotesemptyrl   dropresample	DataFramelastr~   r6   minsum	set_df_tzfix_Yahoo_dst_issueformat_history_metadatar   'fix_Yahoo_returning_prepost_unrequestedparse_actionsrename_axisr   Seriesr   r   any_dividends_convert_fxr   floorloc	Timedeltato_datetimeshape
sort_indexsafe_merge_dfsisna!fix_Yahoo_returning_live_separatename
duplicated_standardise_currency_fix_bad_div_adjust_fix_zeroesilocconcat_fix_unit_mixups_fix_bad_stock_splits_repair_capital_gainsauto_adjustback_adjustnproundfillnaastypeint64r   all	_resample_consolidate)?r    periodrB   startendprepostactionsr   r   rz   keepnaroundingrK   raise_errorsloggerinterval_userperiod_userr   
_exceptionerr_msg
start_userend_userstart_dtend_dt	period_tdrJ   params_prettykrI   r!   get_fndt_now
data_delay
safe_chartresult_list
first_itemrN   intraday_price_data_debugfail
quote_typeexpect_capital_gainstz_exchangerd   quotesmsgquotes2tps	dividendssplitscapital_gainsprice_currencyf_currency_mismatchstart_dend_dt_sub1df
last_tradef_nadf_lastedata_colnamescmask_nan_or_zeros?                                                                  r"   historyzPriceHistory.history%   s5   ^ $$&MMbdv  DE  F ^#K Kh"== 4 !_``}1CWW:!1$++!>J!*oG'.}}T1'=a'@D$#HNN,J,J((W- >>++U?%NN2<<+;+;E+B+M+Mb+Q+V+VXY[\]ELL,,U3>>rBGGIEU99&AAEY00a88E$H
CFv||~'>Bz-dkk:
j/#*==q#9!#< (F(F$$LL)~~''++E26H**,-E))#r2Ff&&()C>S!E$@$@$GGH..01))%0;;B?&**,-||~&;ejjl+C=4' #f!%FF #g!]2 #h #j 0QJE3 !dee#!88@	;%	1Ff..01C=%	1H 2 2 45EC!&37F\\^Fv&F%^^-z#*  *&!&F: 5xVWW' 	lAM!#&r||F1IC'H'T'TUZ'['f'fgi'j#ka 	l 	}$<S=O<PQR .t{{m<?\\#C0<<UCF\\%%e,F",,R8J
"f,--	D
 $tyy0DL%&QRR99;D		:2**739rJ$..2K+t,[1AA1E(^1r
!~~f-3 "&/5|,*%b)Z7FNflln&=2fZ&8%9!;;%!
|4!!U(E(Q(QRW(X(c(cdf(g(l(l(n'op!!U(E(Q(QRW(X(c(cdf(g'hi!'#!z^3!!Ss(C(O(OPU(V(a(abd(e(j(j(l'mmn%oo!!Ss(C(O(OPU(V(a(abd(e'ffg%hh!9VHA!66<z$5-dkk;LMJDd#(=#8m9L8MQ!OO-dkk;LMJD_g4=3I!4tG}W7Mm7\!\_c!cc-dkk;LMJDD Wgx9P9X`del`mnv`w  @D  EL  @M  NV  @W  XY  @Z  [g  @h  ip  @q  rs  @t-dkk;LMJDd&<&<]&KKTYTpTpqwTx-dkk6499TMcMcdqMrCstJD*oG&}}T15a8DHNN$B$B  W%//;@`@`dl@l370>>## ++,<=
)-BB,,-CD))*5 fD$:$:$>$>}b$QQejjl#C\\#C0<<UCFNN005EU11&99EY((a00E ##DM($;A$>?v||||B6#4#4U#;#G#G#MMV\\"%56<<[[M!EFC[A[[M!@a@QQVWC[[M!@a@QQUV\VbVbceVfUghCS >>u$LLDKK=(FGHoog.G\\(<(<--/++-u~))+ )..0$[1668!(+//1D F ;?**68<*%b)Z78(8D<R<R(R(()9:Cc2<<0).)F)FtG]G]rv)w&370,,-=>BB68UXYF<<[[M!=>C[A[[M!8a8IOC[[M!8a8Ifll[]N^M_`CS ,1+>+>tG}X?VWX?Y+Z(	6=# M__VX{CF!.1==fEDL99;DL 	8[IIY... #,"7"7"?!%!7!7
!C!)%'N&/
&;~&M#&**,.B"6$($>$>y.Z`$a	%NN:AN>	"+K"8"D"DV"L iikDO$!OOM8[QM"/"@"L"LV"TD"$))+D<< ,,q///4( )gh 7I ,$1$5$5gh$?M%#ZZ1F? 2<<?2K$%l{3	( -l{ ;!- *%b)Z7 >>&,,*;*;<HH`d  sBH  CFLq!A%"$..1E1E"F"R"RS^jn  }L"R  #M	||A"!~~fll.?.?@LL[dh  wFL   G  ??1!%%b)X>B"**$:;BFF2k?'');67!B{O<<?Q%%b&(;BRZZ'@ABFF2n%**,n<=!$B~""1%)))"mXF"**,FGr/*//1?BC&)?#88[[M!EFCW\[[M!@!USC[[M!@!TRTRZRZ[]R^Q_`CS@@VJEWYdfmv|  HP  QJ!;Eg;NWaWfWf2gD"";/$$'$223LLDKK=(GHIB
  55b(CLB19D"":.h<$$&Dxxz)*tX~&))"hJB 88**27723<;PWXbjj0&+B{OYY 5w?@&&r8['JB++B+FB!!"hWEB ++B/BB	<&&r*&&r* "d7mH5a8@MNB(|**1-44RXX>8&BHHM"BHHM !OX`aB,z9<jjM(5I1bjjQIMI "= 1 6 6 8B}<MQR<R SXX^_X`)//0@ABB}$Hm[IB88[[M!ABCW\[[M!<RXXa[MOC[[M!<RXXa[MbhhWYl^\CS __++7D<\<\`h<h/3D,		   	 	HNN$B$B %C	  	D	H  	<HNN$B$B6:6:&DLLT[[':;;	<0 Js`   6AX6 A)AY, P!/AY> S<A[&TA[&X6/AY)Y(AY)Y,AY;Y:AY;Y>	A[#ZAA[[A[#c                     |||f}|| j                   j                         vrG| j                  |||d      }|| j                  | j                  | j
                  d| j                   |<   | j                   |   S )NT)r   rB   rz   r   )pricesr   r   capital gains)r   keysr  r   r   r   )r    r   rB   rz   	cache_keyr  s         r"   _get_history_cachezPriceHistory._get_history_cache&  s{    vv.	D//4466VhvW[\B8::>,,AEATAT.VD	* ""9--r$   c                 <   | j                   d| j                   vr>|t        k(  r| j                   | j                   d   }nd}| j                  dd|      d    | j                  du r+t	        j
                  | j                         | _         d| _        | j                   S )	z
        repair default value depends on whether user requested price repair
        with previous history() call. If user did not set repair here, then
        it is set to match previous history() call.
        rm   rO   Fr,   r=   )r   rB   rz   r  T)r   r
   r  r   r   r   )r    rz   s     r"   get_history_metadataz!PriceHistory.get_history_metadata/  s     !!)-=TE[E[-[#))5!33LAF #F##4$v#NxX++u4%*%B%B4CYCY%ZD"/3D,%%%r$   c                 0    | j                  d||      d   S )Nr%   rB   r   rz   r   r  r    r   rz   s      r"   get_dividendszPriceHistory.get_dividendsG  s     &&VF&ST_``r$   c                 0    | j                  d||      d   S )Nr%   r  r  r  r  s      r"   get_capital_gainszPriceHistory.get_capital_gainsJ  s     &&VF&STcddr$   c                 0    | j                  d||      d   S )Nr%   r  r   r  r  s      r"   
get_splitszPriceHistory.get_splitsM  s     &&VF&ST\]]r$   c                    | j                  |      }|d   }|d   }|t        |t        j                        rxd|j                  v rjt        j                  |j                  dd      |d      }|d   j                  d	      |d<   |d   j                  d
      |d<   |j                  ddi      }g d}||D cg c]  }||j                  v s| c}   }g d}|D cg c]  }||j                  v s| }}|||   dk7  j                  d         }|D ],  }||   d
k(  j                         s|j                  |d      }. |S c c}w c c}w )N)r   r  r   rd   rs   r0   rq   r%   rT   ry   Dividends FXr   )rs   r!  ro   rt   r   r   )r  r   r   r   r   r   r   r   r   renamer   r   )	r    r   r!   r  divscolsr  r   cols_numerics	            r"   get_actionszPriceHistory.get_actionsP  s`   &&f&5(^K 
4 >:QUQ]Q]C]%%bggkg&BD$OB
^2226BzN o44S9B{OJ#?@BM9Abjja9:E#/Ha13GHH7<0!388a8@A 	2A
c!&&(!,,qq,1	2  : Is   :EEE3Ec                    ||k(  r|S d }d}|dk(  rn|dk(  rfd}t        j                  t        j                  j	                         j
                   d      }|j                  |j                  j                        }nd}n|dk(  rkd}|dk(  rt        j                  t        j                  j	                         j
                   d      }|j                  |j                  j                        }nm|d	k(  rd
}ne|dk(  rI|dk(  rd}	n;t        j                  j	                         j                  d      j                         }	d|	 }n|dk(  rd}nt        d| d      dddddddd}
d|j                  v rd|
d<   d|j                  v r|
d   |
d<   d|j                  v rd|
d<   d|j                  |d    d!k(  d f<   |dk7  r%|j                  |d"d"|#      j                  |
      }n$|j                  |d"d"|$      j                  |
      }d!|j                  |d    dk(  d f<   |d   j!                  d%      j#                         }d&D ]  }||   j%                  |      ||<    |S )'Nepochr-   r1   7Dz-01-01zW-MONr,   5Dr+   MSr.   JANz%bzQS-r%   1Dz(Not implemented resampling to interval ''r~   r   r6   r   r   prod)rf   rh   rg   ri   rk   rs   ro   r   r   rj   ri   rt         ?ro   ry   left)labelclosedorigin)r3  r4  offsetr0   rf   rg   rh   ri   )r   r   r   datetimer   r   r   rl   r   strftimer   r   r   r   r   aggshiftffillr   )r    r  df_intervaltarget_intervalr   r6  r5  resample_period
year_startalign_monthresample_mapdf2
prev_closer  s                 r"   r   zPriceHistory._resampleh  sx   /)Ie#"&\\Y-?-?-C-C-E-J-J,K6*RS
#//<")$"O\\Y-?-?-C-C-E-J-J,K6*RS
#//<%"O%#'00446??EKKM #K=1O$"OGGXXYZ[[ E56% "**$(-L%"**$(4W(=L%bjj(,1L):=r.!3&67W++oVFSY+Z^^_klC++oVFSY+Z^^_klC<?N#S(.89 \''*002
1 	/AV]]:.CF	/
r$   c                 T)   t        j                         }d|| j                  d}t        |t        j
                        st        dt        |            |dk(  r|S |dd  dv rd}d}nd}t        D cg c]	  }||v s| }	}|	d	gz   }
g d
}|D ci c]  }|t        j                  |       }}t        t        |      dz
        D ci c]  }||   ||dz       }}d d t        j                  d      d}dD ]  }t        j                  d      ||<    t        j                  d      |d<   ||v r||   }||   }n*|j                  d| d       d|j                  vrd|d<   |S | j                   || _        || j                   k7  rQ||| j                      k7  r?dj#                  | j                   || j                      |      }|j%                  ||       |S |j'                         }||
   j)                         |k(  }|j+                  d      }||   }|d }no|t        j                  d      z  }t        j,                  j/                  d      |z
  }|j1                  |j2                  j4                        j7                  d      }|j9                  d| d| d| |       |u|j2                  |k\  }||z  }|j+                         sQdt;        j<                  |j+                  d             d}|j%                  ||       d|j                  vrd|d<   |S |j2                  |   }t        |      dk(  r(|j9                  d|       d|j                  vrd|d<   |S |j?                         }d|j                  vrd|d<   ||	   jA                         j+                  d       }|||	   j)                         |k7  jC                  d      z  }||   }|d   gg}|d k(  r!tD        jF                  jG                  d!"      }n|d#k(  r!tD        jF                  jG                  d!"      }n~|d$k(  r!tD        jF                  jG                  d!"      }nX|d%k(  r!tD        jF                  jG                  d"      }n2|dk(  rt        j                  d&      }nt        j                  d      }|j9                  d'| |       t        dt        |            D ]X  }||   }|jI                         |d(   d   jI                         |z   k  r|d(   jK                  |       G|jK                  |g       Z |j9                  d)|       |D ]  }|j9                  d*|d    d+|d(           ! t        t        |            D ]1  }||   }|d   } |j2                  jM                  | gd,-      d   }!|!dkD  rO||j2                  |!dz
     |k\  r8|r1|j2                  |!dz
     jI                         | jI                         k(  r|!dz  }!|d(   }"|j2                  jM                  |"gd,-      d   }#|#t        |      dz
  k  r8|r1|j2                  |#dz      jI                         |"jI                         k(  r|#dz  }#|j2                  |!|#dz    }$||xx   |$jO                         z  cc<   ||   jQ                          4 d}%|D ]  }||j2                  jS                  |         }&|j9                  d.tU        |&      z          |d   }'|'jI                         }(d})|d%k(  r;t        jH                  jW                         |(z
  t        j                  d/      kD  rd})n>|d0v r:t        jH                  jW                         |(z
  t        j                  d1      kD  rd})|)rd2|r|'n|( d3}|j%                  ||       t        j                  d      }*|d#v r|(|z
  }+|d(   jI                         |z   },n+|d$k(  r|(}+|d(   jI                         |z   },n|d   }+|d(   |z   },|+|*z  }+|,|*z  },|r#|+jI                         }+|,jI                         |*z   },|tY        |jI                         |+      }+|j9                  d4| d5| d6|+ d7|, |       t        j                         }t[        |d8      r+|j\                  }-|j_                  t`        jb                         | je                  |+|,|dd|dd9      }.t[        |d8      r|j_                  -       |.|.jf                  rd2|r|'n|( d3}|j%                  ||       m|.jh                  |d   |d(   ||   z   t        j                  d:      z
   j?                         }.|.jf                  r"d;| d<|r|'n|( d=}|j%                  ||       d|.d><   |d#k(  rjg d?}/|/|&j2                  d   jk                         d@z   dz
  d@z     }0|.j2                  jm                  d       jo                  dA|0z         jp                  |.dB<   dB}1n|d$k(  r/t	        jr                  |.j2                  jH                        |.dC<   dC}1n_d|.jh                  |.j2                  jS                  |&j2                        d>f<   |.d>   ju                         |.dD<   |.jw                  d>d      }.dD}1|.|.|	dEgz      jA                         jC                  d          }.|.jy                  |1      }2|2j{                  dFdGdHdIdJdKdLM      j}                  dNdOiP      }3|1dQv r5|3j2                  jm                  |.j2                  j4                        |3_        nb|.dD   j                         |.dR<   t;        jJ                  |.j2                  d   g|.j2                  |.dD   j                         dkD           }4|4|3_        |j9                  dStU        |3      z          t;        j                  |&j2                  |3j2                        }5t        |5      dk(  rdT| dU|( dV}|j%                  ||       V|d$k(  r|3|3j2                  jS                  |5         }6|&|&j2                  jS                  |5         }7|7dO   |k(  }8|8j+                         r|7dO   |7dW   z  }9t:        j                  |9|8<   |9jA                         jC                         sz|9j                         j                         }9t;        j                  |8      d   D ]E  }:|6j2                  |:   }t        |9      };|3jh                  |dEf   dk7  rv|:|;dz
  k  r |9j                  |:dz      |9j                  |:<   ZdX|6dE   j                  |:   |6dW   j                  |:dz
     z  z
  }<|9j                  |:dz
     |<z  |9j                  |:<   |:dkD  r |9j                  |:dz
     |9j                  |:<   |9j                  |:dz      |9j                  |:<   |6dE   j                  |:dz      dk7  s|9j                  |:xx   dX|6dE   j                  |:dz      |6dW   j                  |:   z  z
  z  cc<   H |7dW   |k(  }=|9j                  |&j2                  t:        j                  Y      j                         j                         }9|&dW   |9z  |3dO<   |=j+                         r|=j                  |3j2                  dY      }>|9j                  |3j2                  t:        j                  Y      j                         j                         }?|>j)                         }@|3dW   |@   |?|@   z  |3jh                  |@dOf<   dZdWg}A|3|3j2                  jS                  |5         |A   j)                         }6|&|&j2                  jS                  |5         |A   j)                         }7|7|k7  }B|Bt;        j                  |6       z  }B|Bj+                         s|j%                  d[|( dV|       	t        t        A            D ]w  }CBd d |Cf    }D|Dj+                         s|7j                  j                  s|7j?                         }7|6j                  j                  s|6j?                         }6d|7DCf<   d|6|D|Cf<   y |7B   |6|B   z  }E|2j                         }F|3j2                  |F_        |F|Fj2                  jS                  |5         j)                         j                  t              }F|Fj                  j                  sFj?                         }FFd d d f   }Ft;        j                  |Ft        A            }F|FB   }Ft;        j                  EdXd\]       }Gt;        j<                  |G      t        |A      k(  rdX}Hnt;        j                  EF^      }Ht        Hd_z  dz
        d`k  r?|&j?                         }&t        D ]!  }|jh                  ||   |k7  |fxx   daz  cc<   # Hdaz  }H|j9                  dbHdc|       t        dX|Hz  d      }It        |Hd      }H|Hdk(  rIdk(  rnBHdkD  r|3|	xx   Hz  cc<   |3d	xx   |Hz  cc<   n"IdkD  r|3|	xx   dXIz  z  cc<   |3d	xx   |Iz  cc<   |&j2                  |&|	d	gz      |k(  j)                         j+                  d         }Jg }K|JD ]"  }:|:|3j2                  vsKjK                  |:       $ t        K      dkD  r|j9                  ddtU        K      z   |       JD ]  }:|:|3j2                  vr|3jh                  |:   }L|d#k(  r:|3j                  |3j2                  j                  |:      dz
     }M|.jh                  |:d  }.|jh                  |:   }N|Nj2                  |N|k(     j)                         }Ode|Ov rLde   |jh                  |:def<   dfOv rLdf   |jh                  |:dff<   dZOv ry|d#k(  r`|:|.j2                  d   k7  rNMdW   |jh                  |:dZf<   t        |jh                  |:dZf   |jh                  |:dff         |jh                  |:dff<   nLdZ   |jh                  |:dZf<   dWOv r)LdW   |jh                  |:dWf<   |LdO   |jh                  |:dOf<   ndOOv rLdO   |jh                  |:dOf<   d	Ov r1Ld	   j                         j                  dg      |jh                  |:d	f<   d|jh                  |:df<   |%dz  }%  |S c c}w c c}w c c}w )hNzprice-reconstructyf_catyf_interval	yf_symbolz#'df' must be a Pandas DataFrame notr7   r0   )dwkmoTFrk   )r-   r%   r=   r;   r:   r9   r8   r7   i  r4   )r-   r%   r=   )r;   r:   r9   r8   <   rG   z,Have not implemented price reconstruct for 'z' interval. Contact developersr   z%Hit max depth of 2 ('{}'->'{}'->'{}')extrarq   r2   ru   zmin_dt=z
 interval=z sub_interval=z	Too old (z rows tagged)r   z/Nothing needs repairing (dts_to_repair[] empty)r+      yearsr-   r%   r=   r)   zgrp_max_size = rP   zRepair groups:z- rW   nearest)methodz
df_block:
i  )r;   r:   ;   z"Cannot reconstruct block starting z9, too old, Yahoo will reject request for finer-grain dataz	Fetching z	 prepost=rV   ->level)r   r   rB   r   r   r   rz   r   )millisecondszCannot reconstruct z block range z3, Yahoo not returning finer-grain data within rangectr)MONTUEWEDTHUFRISATSUN   zW-
Week Start	Day Start
intervalIDrs   )rf   r~   )ri   r   )rj   r   )rh   r   )rg   r6   )rs   r   )rk   r   )rf   ri   AdjCloserh   rg   rs   rk   re  rj   r"  )rb  rc  diffzdf_new:
zCan't calibrate z block starting z so aborting repairri   r1  
fill_valuerf   zCan't calibrate block starting gh㈵>)rtol)weightsg-C6?{Gz?d   z Price calibration ratio (raw) = 6fz:Yahoo didn't return finer-grain data for these intervals: rg   rh   r   )Tr   r   r   r   r   r   r   typer   r   rA   r   r   r   warningr   r   formatinfor   to_numpyr   r   r   r   rl   r   ceilr   r   r   copyr   r   	_dateutilrelativedeltar   appendget_indexerto_listsortisinr   todayr6   hasattrrW  setLevelloggingCRITICALr  r   r   weekdayr   	to_period
start_timer   cumsumr   groupbyr:  r#  rf  intersect1dnanr<  bfillwherer   reindexisnanflags	writeablesizer   floattiler   averageabsr   get_locr   )Pr    r  rB   r   tagr   
log_extrasr   r  
price_cols	data_cols	intervalsiitdsnextsmin_lookbackssub_intervaltd_ranger   f_repairf_repair_rowsrR   min_dtf_recentdts_to_repairdf_v2f_gooddf_good
dts_groupsgrp_max_sizedtgg0i0glilgood_dtsn_fixeddf_blockr   r  rejecttd_1dfetch_start	fetch_end	log_leveldf_fineweekdaysweek_end_daygrp_coldf_fine_grpdf_new	new_indexcommon_indexdf_new_calibdf_block_calibf_tagdiv_adjustsidxndiv_adjf_close_badf_close_bad_newdiv_adjusts_newdiv_adjusts_new_np
calib_colscalib_filterjfratiosrj  not1ratio	ratio_rcpbad_dtsno_fine_data_dts
df_new_rowdf_last_week
df_bad_row
bad_fieldssP                                                                                   r"   _reconstruct_intervals_batchz)PriceHistory._reconstruct_intervals_batch  s    $$& 3H[_[f[fg
"bll+BDHMMtIAB<,,GHH!1=AQ"Wa=
=(+	 H	CLMa5//99MM9>s9~PQ?Q9RSA1yQ//SS $D	8K8KQT8UV+ 	<A(22;M!	<'11r:du ?LH~HNNI(Sqrs"**,"';I ++3/7D,t777HdNnNnHo<o9@@AaAachim  jJ  jJ  dK  MU  VCKK:K.I]]_i=))+s2 !, ,'9F$$!,,A\\%%e,q0F&&rxx{{388=Fwvhj
.W_ijxx6)H)H4M $$&!"&&1)=">!?}MCz2bjj0&+B{O	/}"LLJR\L]"**,"';I	emm+!&E+j>&&(,,!,452j>224;@@a@HHV* %Q'()
5 $22@@q@ILU"$22@@q@ILT!$22@@q@ILT!$22@@q@ILT!$..A6L$..B7L|n5ZHq#m,- 	(Aq!Bwwy:b>!,113lBB2%%b)!!2$'	( 	%Z8 	1ALL2adV4"w/0	1 s:' 	!A1A1B**B4	*B1EBAvNgmmBF&;v&E&7==a+@+E+E+G2779+T!GB2B**B4	*B1EBCL1$$ W]]26%:%?%?%ARWWY%N!GB}}RQ/HqMX--//MqM 	!"  y	A"((--*+HLLX67tHmmoGFt#)=)=)?')IYM`M`fiMj(j/Y^^5I5I5Kg5UYbYlYlrtYu4u:x8U\:]  ^W  XCz2''Q/E5 %0bEJJL83	T!%bEJJL83	dbEH,	 5 KI)..0%NN,u4	!!&++-=LL9\N)G9Ak]RTU^T_`hrLs((*Fvw'"LL	 0 01ll)lhmw{  FM  VZ  cgl  hGvw'	*'--:x8U\:]  ^W  XCz2kk!A$"\0B(BYEXEXfgEh(hinnpG}}+H:]x8]dBe  fY  ZCz2GEN5 L'):)B)B)Dq)H1)LPQ(QR(/(A(A$(G(Q(QRVYeRe(f(q(q%&T!')~~gmm6H6H'I$%IJGMM..x~~>EF(/(=(=(?%!,,u1,5&wz[M'ABGGIMMSTMUUVG!//'2K __&'."$.( % * +1&*k9R&*S  55%||778H8HI"),"7"<"<">IIw}}Q'7&8'--P\H]HbHbHdghHh:ij	(LL)CK78 >>(..&,,GL< A%(
2B7)K^_Cz2 4%fll&7&7&EF!)(..*=*=l*K!L&{3s:99;"0"=w@W"WK
 *,K&&++-113&1&7&7&9&?&?&A#%88E?1#5 \C!-!3!3C!8B #K 0A%zz"k/:a?#&Q;<G<L<LSSTW<UK$4$4S$9 /2L4M4R4RSV4WZfgnZoZtZt(+a[1 51 /1G<G<L<LSSTW<UX_<_K$4$4S$9#&7<G<L<LSSTW<UK$4$4S$9 =H<L<LSSTW<UK$4$4S$9'3K'@'E'EcAg'NRS'S(3(8(8(=|T_G`GeGefilmfmGn<H<Q<V<VWZ<[H\ B\ )\(=)\, '5W&=&D&1&9&9(..UWU[U[&9&\&b&b&d&j&j&l.6w.?+.M{+&??,.9.A.A&,,[`.A.aO.9.A.A&,,[][a[a.A.b.h.h.j.p.p.rO1@1I1I1K.JPQX/ZlJmp  AS  qT  KTFJJ'9;'FG !'*J!&,,"3"3L"AB:NWWYL%hnn&9&9,&GHT]]_N*c1L'BHH\,B+BCL##%=gYFYZblm3z?+ +!!Q$''557)//99)7)<)<)>'--77'3'8'8':+,N1a4()*LA&+ $L1L4NNF!&&(G"LLGMgmm00>?HHJQQRWXG==**!,,.ag&Ggggs:7Gl+GJJvs99Dvvd|s:.

67;5<?#d* $==?) 7AIIeAhmQ./36/7LL;E":FjLYcEk1-I%OEzi1n19 :&%/&8$-$] :&#	/9&8$	1$ nnhzXJ/F&G3&N%X%X%Z%^%^de%^%fgG! 1fll* %++C0	1
 #$q(Y\_`p\qq  zD  E !fll* #ZZ_
u$#);;v||/C/CC/H1/L#ML%kk#$/GVVC[
'--jC.?@IIK
Z'-7-?EIIc6k*J&,6u,=EIIc5j)Z'5(SGMM!4D-D1=g1F		#v+.03EIIc6k4JEIIVY[`V`La0b		#u*-1;F1C		#v+.j(.8.AEIIc7l+2<[2IEIIc;./ J.2<[2IEIIc;./z)/9(/C/I/I/K/R/RSX/YEIIc8m,.2		#{*+1C!qy	z _ > NSs   1	AR;ARAR AR%c                    |dvr||fS |}|dk(  rd}d}n|dk(  rd}d}n	|dk(  rd}d}|d	   d
kD  }|j                         s||fS |j                  t        j                  |      d
   d      }d}|j                  t
        j                  j                  d      t        j                  d      z
  kD  r,	 | j                  d   |d   z  }t        |z  dz
        dk  rd}|rt         D ]  }	||	xx   z  cc<    || j                  d<   d| j                  d<   |d   dk7  }
|
j                         r|ddg   j#                         }|d   j%                         j'                  d|d   j                  d
         |d<   ||
   }|d   |d   z  j)                         }t+        |      d
kD  r%t        j,                  |      dkD  r|dxx   z  cc<   ||fS # t        $ r t        j                  j                  s Y w xY w)N)GBpZAcILAr  GBPrk  r  ZARr  ILSrk   r   rP   Tr2   rG   r4   regularMarketPriceri   r0   皙?Frd   currencyRepairedrs   ry   rg  )r   r   r   r  r   r   r   r   r   r   r   r  r   r   r   r   r   rt  r<  r;  rr  r   r  )r    r  rd   	currency2rR   f_volumelast_rowprices_in_subunitsr  r  f_divr$  div_pctss                r"   r   z"PriceHistory._standardise_currency#  s&   00x<	uIAIAIA h<>||~x<77288H-a045!==BLL,,U3i6I6Ir6RRS	../CDxPWGXXa{#c)).& % 1
-6z*5912;$99; w{+,113D M//177d7mFXFXYZF[7\DM;D[)DM9CCEH8}q RZZ%9A%=;1$9}5  ~~55	s   2+G $G65G6c                    |d   j                         D cg c]
  }||k7  s	| }}g d}|D ]  }d }|dk(  r| d}d}	n+|dk(  r| d}d}	n||v r||v r
| | d}d}	n| d}d}	| d}t        | j                  || j                        }
|
j	                  d|      d	   j
                  d
   }|	rd|z  }|j                  |d   |k(  dfxx   |z  cc<   |t        | j                  || j                        }|j	                  d|      d	   j
                  d
   }|j                  |d   |k(  dfxx   |z  cc<    ||d<   |S c c}w )Nrd   )USDJPYEURCNYr  CADr  =XFTr+   )r   rz   ri   rP   r0   rs   )uniquer   r   r   r  r   r   )r    r   fxrz   r  bad_div_currenciesmajor_currenciesfx2_tkrfx_tkrreversefx_datfx_ratefx2_datfx2_rates                 r"   r   z"PriceHistory._dividends_convert_fx]  s   )2:)>)E)E)GSA1PR7aSSE# 	QAGEz4ru4r&&21A+A3rd"
 3bD)!$**fdllCFnnE&nA'JOOPRSGG)MM)J/2K?@GK@"&tzz7DLLI"??%?GPUUVXYi
3Q6CDPD?	QB !#	*I Ts
   
EEc                 p    |j                   r|S | j                  |||      }| j                  ||||      }|S N)r   _fix_unit_switch_fix_unit_random_mixups)r    r  rB   r   r   rC  df3s          r"   r   zPriceHistory._fix_unit_mixups  s=    88I##B+>**3+wO
r$   c                 H   |j                   r|S t        j                         }d|| j                  d}|j                  d   dk(  rd|j
                  vrd|d<   |S |j                  d   dk(  r(|j                  d|       d|j
                  vrd|d<   |S |j                         }|j                  j                  !|j                  j                  |      |_        n9|j                  j                  |k7  r |j                  j                  |      |_        dd	lm} g d
}	|	D 
cg c]  }
|
|j
                  v s|
 }	}
||	   dk(  j                  d      j                         }|j                         r||   }||    }||    }nd }|}|j                  d   dk  r(|j!                  d|       d|j
                  vrd|d<   |S ||	   j                         }|j#                  |dd      }||z  }|dz  j%                         dz  }|dk(  }d|z  }|dz  j%                         dz  }|dk(  |dk(  z  }||z  }|j                         s(|j                  d|       d|j
                  vrd|d<   |S d}t'        t)        |	            D ]!  }|d d |f   }|	|   }
||j*                  ||
f<   # ||k(  j-                         }| j/                  ||||      }||	   j                         |k(  }||	   j                         |k(  j-                         }|dkD  r||	   j                         |k(  |z  }t'        |j                  d         D ]  }||d d f   }|j                         s|j                  |   }dD ]<  }
|	j                  |
      }||   s|j*                  ||
f   dz  |j*                  ||
f<   > d}
|	j                  |
      }||   r0|j*                  |ddgf   j1                         |j*                  ||
f<   d}
|	j                  |
      }||   s|j*                  |ddgf   j3                         |j*                  ||
f<    ||	   j                         |k(  |z  }t'        |j                  d         D ]  }||d d f   }|j                         s|j                  |   }dD ]<  }
|	j                  |
      }||   s|j*                  ||
f   dz  |j*                  ||
f<   > d}
|	j                  |
      }||   r0|j*                  |ddgf   j1                         |j*                  ||
f<   d}
|	j                  |
      }||   s|j*                  |ddgf   j3                         |j*                  ||
f<    ||	   j                         |k(  }|j-                         }n|}||z
  } ||z
  }!| dkD  r*d|  d| d}"|!dkD  r	|"d|! d z  }"|j!                  |"|       ||	   j                         |k(  }t'        t)        |	            D ]A  }|d d |f   }#|#j                         s|	|   }
|j*                  |#|
f   |j*                  |#|
f<   C |\d|j
                  vrd|d<   t5        j6                  ||g      j9                         }t5        j:                  |j                        |_        |S c c}
w )!Nprice-repair-100xrF  r   r   Fr0   z3Cannot check single-row table for 100x price errorsrN  )ndimage)rg   rf   rh   ri   rj   rq   z6Insufficient good data for detecting 100x price errors)   r  wrap)r  mode   rl  r1  zNo sporadic 100x errors      )rf   ri   rk  rg   rf   ri   rh         Y@zfixed /z currency unit mixups (z	 crudely))r   r   r   r   r   r   r   rt  rl   r   r   r   scipyr  r   rr  rq  median_filterr   rA   r   r   r   r  r6   r   r   r   r   r   )$r    r  rB   r   r   r   r  rC  _ndimager  r  f_zeroes
df2_zeroesdf_origdf2_datamedianr  ratio_roundedr  r  ratio_rcp_roundedf_rcpf_eitherr  r  fin_before
df2_taggedn_afterr  r  n_after_cruder  n_fixed_crudely
report_msgfjs$                                       r"   r  z$PriceHistory._fix_unit_random_mixups  s    88I $$& 3H[_[f[fg
88A;!"**,"';I88A;!LLNV`La"**,"';Iggi99<<		--k:CIYY\\[(		,,[9CI 	.A	 )>1Q#++-=Q>	>	Na',,!,4==?<<>XJxi.C(mGJG99Q<1KKPXbKc"**,"';Iy>**,''vF'K6!**,r1S I	&^224r9#%*;s*BCu9||~LL2*LE"**,"';I s9~& 	!A!Q$B!A CGGBEN	!
 O((*//XwL^,,.#5
y>**,388:Q; Y((*c1Q6A1771:& Lq!tWvvxiil* @A!*A!u*,&&a.4*?Q@
 OOA&a5&)ggcFG3D.D&E&I&I&KCGGCFOOOA&a5&)ggcFG3D.D&E&I&I&KCGGCFO'L* ^,,.#5>E5;;q>* L1a4[vvxiil* AA!*A!u*,&&a.5*@QA
 OOA&a5&)ggcFG3D.D&E&I&I&KCGGCFOOOA&a5&)ggcFG3D.D&E&I&I&KCGGCFO'L* Y002c9J&NN,M#M]*!M1Q;!'!H:5KLJ"/!2)<<
KK
*K5 y>**,3s9~& 	4A!Q$BvvxaL!(RU!3A		4
 !*"4"44*/
;'))S*-.99;Csyy1CI
e ?s   "Z6Zc                 ^    | j                   d   dk(  rd}nd}| j                  ||||dd      S )Nrd   KWF  rl  T)unit_switchcorrect_dividend)r   _fix_prices_sudden_change)r    r  rB   r   r  s        r"   r  zPriceHistory._fix_unit_switch'  sA     !!*-6AA--b(KX\os-ttr$   c                    |j                   r|S t        j                         }d|| j                  d}|d   dv }|j	                         }|j                         }|j                  j                  !|j                  j                  |      |_        n9|j                  j                  |k7  r |j                  j                  |      |_        t        D 	cg c]  }	|	|j                  v s|	 }
}	||
   dk(  ||
   j                         z  }d }|rt        j                  |j                  d      d	      j!                  |j                  j"                        }|j%                         |j'                         z  }|j                  |d
kD     }t)        j*                  |j                  j"                  |      }||   }||    }|j                   rd|j                  vrd|d<   |S |j                         }||
   dk(  ||
   j                         z  }|d   j-                         |d   j-                         k7  }| j                  j/                  d      rd }n|d   j                         j-                          |d   j                         j-                          z  }|d   dk(  j-                         }||z  |z  }|sX|d   j1                         }d|j2                  d<   t)        j4                  ||d   z        }|dkD  j-                         |z  }||z  }d|j                  v rA|d   dk7  j-                         }|j                         r|| z  }|j                         rd||<   |j-                         }|j                  d      }|||z  }|j                         s(|j7                  d|       d|j                  vrd|d<   |S |j%                         t9        |
      t9        |      z  k(  r(|j7                  d|       d|j                  vrd|d<   |S |
dgz   }d}t;        t9        |
            D ]  }|
|   }	||j<                  |d d |f   |	f<   ! |||j<                  |df<   |d   j-                         dk(  |d   j                         j-                         z  }||j<                  |j                  d      |z  df<   ||j<                  ||z  df<   ||   j-                         |k(  }|j%                         } |j                  |j                  d         }!| j?                  ||||      }||   j-                         |k(  }|j%                         }"|j                  |j                  d         }#| |"z
  }$|$dkD  rd| j                   d|$ d|  d| d}%|$dk  r4tA        tC        tE        |!      jG                  |#                  }&|%d|& z  }%|j7                  |%|       |8d|j                  vrd|d<   t        jH                  ||g      j	                         }||   j-                         |k(  }'t;        t9        |            D ]A  }(|'d d |(f   })|)j                         s||(   }	|j<                  |)|	f   |j<                  |)|	f<   C |S c c}	w ) Nzprice-repair-zeroesrF  rP   rQ   ry   r0   rq   r  )r         ?r   Frg   rh   r  rk   r   ri   皙?ro   TzNo price=0 errors to repairrN  z;No good data for calibration so cannot fix price=0 bad datar  z: fixed r	  z value=0 errors in z price datar3   r/   )%r   r   r   r   r   rt  rl   r   r   r   r   r   r   r   r   r   r  r   r   countr   r{  rr  endswithrf  r   r  r   r   rA   r   r  sortedr   set
differencer   )*r    r  rB   r   r   r   r  r   rC  r  r  f_prices_baddf2_reservegrpnan_pctdtsf_zero_or_nan_ignoref_change	f_vol_badf_high_low_good
f_vol_zero
close_diffclose_chg_pct_absf_bad_price_chgf_splitf_change_expected_but_missing
f_bad_rowsr  r  r  f_vol_zero_or_nanr  r  
dts_taggedr  dts_not_repairedr  r   dts_repairedr  r  r  s*                                             r"   r   zPriceHistory._fix_zeroes8  se    88I$$& 5h]a]h]hi
B<:-]]_ggi99<<		--k:CIYY\\[(		,,[9CI!1FAQ#++5EaF
FJ3.#j/2F2F2HH))L,,!,45AII,J\J\JaJabCggi#))+-G--#.C#%77<+=+=+B+BC#H 23K++,Cyybjj0&+B{O	((*C
Os2c*o6J6J6LLLv;'')SZ-@-@-BB;;%I #F 0 0 2 ; ; ==3u:??CTC]C]C_B_`Oh-1,668J"_4x?I  !\..0
%&
"$&FF:G+D$E!#4t#;"E"E"G*"T%7	 S[[(>*c1;;=G{{}078)0C-0446BFL!>? $,,.!%%1%-
 #i/J~~LL6jLI"**,"';IZ3s8!;;LLV^hLi"**,"';I(+	 s:' 	1A1A-0CGGLA&)*	1  +.CGGIx'( ]335:s8}?Q?Q?S?\?\?^_JM  a (+<<hFG:=,,h67^,,.#5
>>#YYz~~1~56
//XwL^,,.#5
.."99Z^^^%;<W$Q;[[M'!H:=PQYPZZefC{%d3z?+E+EFV+W&XYL>**LLJL/"+"5"55+0K())S+./::<C 	N##%,s9~& 	/A1a4BvvxaL!#AA		/ 
W Gs   Z&Zc           
         d|j                   vr|S |d   dk(  j                         r|S d}t        j                         }d| j                  d}|j                         }|j                         }|d   j                  d       j                         |d<   |d	   dk(  |d   dk(  z  }|j                  |df   j                         }|j                  dd
      }d|j                   vrd|d<   |d   |d   z  |d<   |rRt        j                  |d<   t        j                  |d<   |d   |d   z  j                  d      |d<   t        d|d       ||d   dkD     j                   }|d   j#                         }|d   j#                         }	i }
|D ])  }|j                   j%                  |      }|dkD  s%|d	   j&                  |   }|d   j&                  |   }||k  rO|||d
z
     z  }|||d
z
     z  }||d
z
     ||   z
  ||d
z
     z  }||z
  }t        ||z
        }t        |||z   z
        }||k  }||
|<   |st        d|j)                          d|dz  dd|dz  dd       t        d|dz  dd       t        d|dz  dd       t        d|d       t        d|d       t        d|        , t+        |
j-                               t/        |
      z  }|rt        d |dz  dd       |d!k\  r|
j1                         D ]  }|j                   |   }|d	   j&                  |   }|d   j&                  |   }||z
  }||j                  |d	f<   |	|d
z
     ||d
z
     z  |	|   ||   z  z  }d"||z   ||d
z
     z  z
  }||z  }|j                  d |t3        j4                  d
      z
  dfxx   |z  cc<   d#|j                  d |df<   d$|j)                          d%|d}|j7                  ||&       |s||j                  |df<    |d   |d   z  |d<   |r|d   j                  d      |d<   |S |j                  dd
      }|S )'Nrt   r   Fzrepair-capital-gains)rG  rI  ri   )fill_methodzPrice_Change%rs   r0   rq   r   rj   AdjScaleFactor
correctionr3   AdjYahooz# price_drop_pct_mean = .4fz# z: div = rl  .1fz%, cg = %z- price_drop_pct = z- price_drop_pct_excl_vol = z- diff_div = z- diff_total = z- cg_is_double_counted = z- pct_double_counted = gZd;O?r1  Tz'Repaired capital-gains double-count at z. Adj correction = rN  )r   r   r   r   r   rt  r   
pct_changer  r   meanr   r   r  r   printrl   rr  r  r   r   r   valuesr   r  r   r   rq  )r    r  r   r   r  no_distributionsprice_drop_pct_meanr1  r  acdcsr  r  dividendr  div_pctcg_pctprice_drop_pctprice_drop_pct_excl_voldiff_div
diff_totalcg_is_double_countedpct_double_counteddividend_true
adj_beforeadj_correctrE  r   s                               r"   r   z"PriceHistory._repair_capital_gains  s   
 "**,I1$))+I $$& 6T[[Q
WWY]]_
 !k444FJJL?{Oq0R5HA5MN ff%5%FGLLNWW_1W- bjj(#B{O{Obk15	 "B}!vvB| obk9@@CBzN,-@,EFGO$q()//wK  "_%%' 	NB((""2&CQw k?//4 "? 3 8 8 =m+"Qs1uX-&3q51 #$CE(QsV"3qQx!?*8;N*N'6@A !8Gf<L!MN
'/*'<$/CBrwwyk'#+c1B(6RU:VYJZZ[\]/s0B3/GqIJ89PQT9TUX8YYZ[\M(389OJs+;<=56J5KLM=	N@ !.S9+,>s,B3+GqIJ&xxz :XXc]k?//4 "? 3 8 8 =
 !)= 8*7r;' !Qi#a%0RWQsV^D
!]]%BaAh$NN(:5
19..q111589ZG9+/ssK'(?	{J]^hil]mnCz2/9BFF2|+,/:2 W+5	1;5	*BuI 	 Q'B	r$   c                 Z   ||j                   r|S |dv r|S |d   dv }d|j                  v r|d   dkD  j                         r|S t        j                         }d|| j
                  d}|d   d	k7  j                         }|j                         s|j                  d
|       |S | j                  d   dk(  rd}	nd}	d }
d}|j                         }|j                         }d|j                  vrd|d<   d}|d   j                         j                         }||   j                         }||    j                         }|d   d	k7  j                         }|j                         s|j                  d
|       |S t        j                  |      d   }|d   j                  t        j                  t        j                   g      }|j                         ro| }|d   j                         }|d   j                         }|dz  }|||kD  z  }|j                         r$||   dz  ||<   |||kD  z  }|j                         r$||d<   |d   j!                  t        j                  t        j                   gt        j"                        |d<   |d   |d   z  |d<   |d   j%                         |d<   |d   j                         |d   j                          z  }|d   |   |d   |   z  |j&                  |df<   |j)                  dd      }g }t+        t-        |      dz
  dd      D ]5  }||   }|dk(  r|j.                  |dz
     }|d   |d   z
  }|d   j.                  |   }|dkD  sD||z  dz
  dk  sP|j0                  |dz
     }|d   |z   }||d   k\  ss||d   k  s|||j&                  |df<   |d   j.                  |   |d   j.                  |   z  } | d||d   j.                  |dz
     z  z
  z  }!|d   j.                  |dz
     |!z  |j&                  |df<   d|j&                  |df<   d}|j3                  |j0                  |   j5                                8 t-        |      dkD  r/d|D "cg c]  }"t7        |"       c}" }#|j9                  |#|       t+        t-        |      dz
  dd      D ]p  }||   }|j0                  |   }$|d   j.                  |   }|dk(  r0||d   j.                  |dz
     z  }%d}&d }'|rG|j&                  t7        |$j5                                  j                         }(| j;                  |(|d!      }(t=        |d   j.                  |   |d   j.                  |dz
     dz  d"#      rK|d   j.                  |dz
     dz  |d   j.                  |   z
  })||d   j.                  |dz
     dz  z  }%d||d   j.                  |dz
     dz  z  z
  }*|d   j.                  |dz
     |d   j.                  |dz
     z  }+t=        |+|*d"#      s~|*|d   j&                  d |$t?        j@                  d$      z
   z  |j&                  d |$t?        j@                  d$      z
  df<   d|j&                  d |$t?        j@                  d$      z
  df<   |r|d   j.                  |dz
     dz  (d   j.                  d   z
  },nt=        |d   j.                  |   |d   j.                  |dz
     dz  d"#      rI|d   j.                  |dz
     dz  |d   j.                  |   z
  })||d   j.                  |dz
     dz  z  }%d||d   j.                  |dz
     dz  z  z
  }*|d   j.                  |dz
     |d   j.                  |dz
     z  }+t=        |+|*d"#      s~|*|d   j&                  d |$t?        j@                  d$      z
   z  |j&                  d |$t?        j@                  d$      z
  df<   d|j&                  d |$t?        j@                  d$      z
  df<   |r~|d   j.                  |dz
     dz  (d   j.                  d   z
  },nR|d   j.                  |dz
     |d   j.                  |   z
  })|r(|d   j.                  |dz
     (d   j.                  d   z
  },|t-        |      dz
  k  rSt        jB                  |)|d   j.                  |   |d   j.                  |dz      z
  g      }-t        jD                  |-      }.nt        jB                  |)g      }-|)}.t-        |      |z
  d%k  r(tG        t-        |      |d%z         }/tE        d|/d&z
        }0n'tE        d|d%z
        }0tG        t-        |      |0d&z         }/|/|0z
  d%k  rt        j"                  }1no|d   j.                  |0|/dz
   j                         |d   j.                  |0dz   |/ j                         z
  }2t        jH                  t        jJ                  |2            }1g }3|-d	k(  jM                         r|d'   j.                  |   dk(  rkt        jN                  |d'   d	k(        t-        |      z  }4|%dz  d(k  r|3j3                  d)d	d*       n|4d+kD  r|%d,kD  s|%dkD  r|3j3                  d-d	d*       n|d.   j&                  |$   }5|5d	k(  rd }6nO||5z  }6|6|kD  r|)|1z
  }7n|.}7|7dkD  r8tK        ||7z
        }tK        |6|7z
        }8|8|'z  |k  r|3j3                  d/|8d*       |%|kD  r|.d	k  r|3j3                  d-d	d*       ntK        ||.z
        }tK        ||	z  |.z
        }9|6|9|'z  |k  rd|3j3                  d-|9d*       nOtK        |6|	z  |.z
        }:|9|:k  r|9|'z  |k  r1|3j3                  d-|9d*       n|:|'z  |k  r|3j3                  d0|:d*       t        jP                  |1      s|)|1z
  };|;dkD  r|r|r
,d1|;z  k  rd};|;dkD  rtK        ||;z
        }tK        ||	z  |;z
        }9|6|9|&z  |k  rd|3j3                  d)|9d*       nOtK        |6|	z  |;z
        }:|9|:k  r|9|'z  |k  r1|3j3                  d)|9d*       n|:|'z  |k  r|3j3                  d2|:d*       |$|||%d3}<|)|<d4<   |.|<d5<   |d'   j.                  |   |<d6<   |1|<d7<   d|<d8<   d|<d9<   d|<d:<   d|<d;<   d|<d<<   t-        |3      dkD  r+tS        |3d= >      }3|3d   }=d|<|=d?   j!                  d@dA      <   tU        jV                  |<g      jY                  dB      }>|
|>}
ZtU        jZ                  |
|>g      }
s |
|s|S |
j                  D ?cg c]  }?|?j]                  dC      s|? }@}?|
j                         }
ddE}At+        t-        |
            D ]o  }|
dF   j.                  |   }|
j0                  |   }$|
dD   j.                  |   }|dk(  r=||d   j.                  |dz
     z  }%|d   j.                  |dz
     |d   j.                  |dz
     z  }B|d   j.                  |   |d   j.                  |   z  }C|C|Bk(  }D|B|Cz  }+d|+z
  }E|Ed(|%z  k  }F|Ed|%z  kD  }G|Drd}FdG|+i}<D|<dH<   G|<dI<   F|<dJ<   |<j_                         D ]  \  }H}I|H|
vrhta        Itb        t        jd                  f      rd|
H<   nBta        Itf              rd|
H<   n,ta        Ith              rd	|
H<   ntk        HItm        |I            I|
j&                  |$Hf<    r @g dKz  }@d|
dL<   t?        j@                  dMN      }J|
d8dJg   j                  d      }K|Kj                         rUt-        |
      dkD  rFt        j                  K      d   }L|
j0                  |K   }M|LD ]  }|
j.                  |   }|jn                  }Nd }O|dkD  r|
j.                  |dz
     }Pn|
j.                  |dz      }P|dD   |	z  PdD   z  }Q|dD   |PdD   z  }RtG        tK        |Qdz
        tK        |Rdz
              }StK        N|Pjn                  z
        Jk  r<PdL   s7Sdk  r2Pjn                  Mv r"|d4   })Pd4   }T|)dO|Tz  kD  rPjn                  }OnN}OnN}OOsd|
j&                  OdLf<   @D ]"  }?|?|
j                  v sd|
j&                  O|?f<   $  dP}U|
j                         }
t+        dt-        |
            D ]  }|
j.                  |   }|jn                  }Nd}Vd}W|d4   })|
j.                  |dz
     }X|dD   |XdD   z  }YtK        |N|Xjn                  z
        Jk  r=XdL   s8|dL   s3tK        Ydz
        Uk  r"|
d4   j.                  |dz
     }Z|)dO|Zz  kD  rd}Wnd}VWsVsVrNn|
j0                  |dz
     }[d|
j&                  |[dLf<   @D ]"  }?|?|
j                  v sd|
j&                  [|?f<   $  @j3                  dL       dL|
j                  v r|
dL   }\|\|
@D ?cg c]
  }?|?dLk7  s	|? c}?   j                  d       z  }\|\j                         r,|
j0                  \   }]dQ|]D $cg c]  }$t7        |$j5                                c}$ }#|j9                  |#|       |
j0                  \   }^|^D ]  }$|$t?        j@                  d$      z
  }_|j&                  d |_dfxx   |
dG   j&                  |$   z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |
dG   j&                  |$   z  cc<   d|j&                  d |_df<   d|j&                  |$df<   d}|
j)                  |$      }
 d|
j&                  \dLf<   |
j)                  dLd      }
dL@v r@jq                  dL       |
@   j                         j                         st-        |
      dkD  rt+        dt-        |
            D ]  }dR\  }`}a|dkD  r(|
dS   j.                  |dz
     |
dS   j.                  |   z  }`|t-        |
      dz
  k  r(|
dS   j.                  |dz      |
dS   j.                  |   z  }a`xs a}`axs `}atK        `|	z
        dTk  stK        a|	z
        dTk  s|
j0                  |   }Nd|
j&                  |Nd9f<    |
@   j                         j                         s7|r3|j                   s%tU        jZ                  ||g      j                         }|S |S t+        t-        |
            D ]  }|
dF   j.                  |   }|
j0                  |   }$|
dD   j.                  |   }|dk(  r=||d   j.                  |dz
     z  }%|$t?        j@                  dUN      z   }bts        jt                  |j0                  |b      }ctG        |ct-        |      dz
        }ctE        d|dVz
        }d|d   j.                  ||cdz    jw                         }e|ed kD  j                         |edWk  j                         z  }f|fj                         r0|t        j                  f      d   d   z   dz
  }c|j0                  |c   }bd}gd}htT        jx                  }icdkD  r|j.                  dcdz    j                         }j|jd   |jd   z  |jd<   |jd   |jd   z  |jdX<   |jd   j.                  dd  j                         |jd   j.                  d d j                         z
  }kt        j2                  d	g|k      }k|k|jdY<   |jdX   j.                  dd  j                         |jd   j.                  d d j                         z
  }lt        j2                  d	g|l      }l|l|jdZ<   |jdYdZg   }k|%d[kD  r|%dk  r|jd   j.                  d   z  }mkdZ   |md\z  kD  }K|Kj                         rt        j                  K      d   }L|LD ]|  }nkdZ   j.                  |n   }o|od]|kdY   j.                  |n   z  kD  s/dkdZ   z  oz  }p|pd^k\  }q|d.   j&                  |$   }5|
d:   j&                  |$   }r|5d	k(  srsqj                         rt        j                  q      d   }st-        |s      dkD  rt        jz                  t-        s            }tt+        t-        |s            D ]S  }s|   }npj0                  |n   }u|u|$k  rt|xx   |$uz
  j|                  z  cc<   7t|xx   d(u|$z
  j|                  z  z  cc<   U t        j~                  t      }s|   }vnsd   }vd}hpj0                  v   }i n%od_mz  kD  sejd   dk  j                         rd}g n |
j&                  |$dJf   }FgrFrd}gi }<g|<d`<   h|<da<   i|<db<   |gr|d.   j&                  |$   }5|5d	k7  r||5z  }6|6|kD  r*|
d7   j&                  |$   }1|
d4   j&                  |$   })|)|1z
  }7n|
d5   j&                  |$   }.|.}7|7dkD  r5tK        ||7z
        }tK        |6|7z
        }8|8|dcz  k  rd|
j&                  |$d:f<   |<j_                         D ]  \  }H}I|H|
vrta        Itb        t        jd                  f      rd|
H<   nata        Itf              rd|
H<   nKta        Ith              rd	|
H<   n5Hdbk(  rtU        j                  dde      |
H<   ntk        HItm        |I            I|
j&                  |$Hf<    d8|
j                  v sda|
j                  v sd|
j&                  |
da   j                         d8f<    @d`dagz  }@|@D ])  }?|
|?   j                         r|
j)                  |?d      }
+ db}?|?|
j                  v r4|
|?   j                         jM                         r|
j)                  |?d      }
@D ?cg c]  }?|?|
j                  v s|? }@}?|
j                  dS      }
 A|
dSf      |
dg<   |
dg   j                         }w|wD ]  }x|
dg   |xk(  }y|
|y   j                         }zt-        |z      }{|zdSg   j                         }|t-        ||      dkD  r|dS   j0                  j                         j                         j                  j                         dhz  }}|}j.                  d   |}j&                  |}j0                  d   <   |}||di<   ||dS   ||di   z  ||dj<   @D ]7  }?z|?   j                         j                         r%zj)                  |?d      }z9 @D ?cg c]  }?|?zj                  v s|? }~}?|~D ]  }?z|?   j                         }t        jN                  |      }|d{fv r3{z  }|?d8k(  rd}d,}dazj                  v rz|?   |zda   k(  jM                         rjd`zj                  v rz|?   |z|?   |zd`   z  k(  jM                         rudk}zd`   j                         }t        jN                  |      }{t        jN                  |         }||{z  }||kD  r'y|
d`   j                         z  }Kd|
j&                  |K|?f<   dJzj                  v r5zdJ   jM                         r"zd7   y      dk(  jM                         rdl}n/d,}n,d`zj                  v rz|?   |zd`   k(  jM                         rdk}ndk}k\  rdd|
j&                  y|?f<   da|
j                  v rCd|
j&                  ydaf<   tT        jx                  |
j&                  |ydbf<   |
|y   j                         }zk  rd|
j&                  y|?f<   |?d9k(  rFd}dm}dIzj                  vrdn}dk}k\  rd|
j&                  y|?f<   /k  rd|
j&                  y|?f<   G|?dHk(  rz|?   j.                  d   rdk(  re|?dJk(  rl|?d`k(  rs|?dLk(  rz|?dak(  r|?dov s  d8@v rdJ@v rdp}?d|
|?<   t+        t-        |
            D ]u  }|
j0                  |   }$|
j.                  |   }>|>d8   s'|>dJ   s-|>dD   }|>dS   }||z  }|>dG   }d|z
  |z  }E||Ez  }YtK        |Y|	|	z  z
        |	k  }|sed|
j&                  |$|?f<   w |
|?   j                         s|
j)                  |?d      }
n@j3                  |?       d;|
j                  v rWdqD ].  }?|?|
v r|
|?   |
d;   z  |
|?<   |
d;   |
|?<   @j3                  |?       0 |
j)                  d;d      }
@jq                  d;       |
j                         }
|
|
@   j                  d         }
|
j                   r3|j                   s%tU        jZ                  ||g      j                         }|S i }t        |
dg   j                               D ]  }x|
|
dg   |xk(     }z|zj                  dr      }zd|zds<   t+        t-        |z      dz
  dd      D ]g  }zj.                  |   }>|>jn                  }$|$t?        j@                  d$      z
  }_dH|>v xr |>dH   }dJ|>v xr |>dJ   }dI|>v xr |>dI   }d`|>v xr |>d`   }d9|>v xr |>d9   }d8|>v xr |>d8   }d:|>v xr |>d:   }da|>v xr |>da   }hdp|>v xr |>dp   }t        jN                  @D ?cg c]  }?|?|>v s|>|?    c}?      }rrd k(  rd}dz  }hr4rd}dzj&                  |$d8f<   dz  }rd}dzj&                  |$dJf<   dz  }rrd}dzj&                  |$d`f<   dz  }dk(  rsrrdtndu}Hj                  |Hg       j3                  |$       d|>dS   z
  |>dG   z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   rdv}H|	}|>dD   |z  }||j&                  |$df<   |Hdwz  }Hdd|>dG   z
  |z  z
  }||>dG   z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   j                  |Hg       j3                  |$       rdx}Hd|	z  }|>dD   |z  }||j&                  |$df<   |>dS   |z  }d|z
  }|>dG   }+|Hdwz  }H||+z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   j                  |Hg       j3                  |$       nrdy}Hj                  |Hg       j3                  |$       d|>dS   z
  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   
hr:dz}Hj                  |Hg       j3                  |$       d|>dG   z  }|j&                  d _dfxx   |z  cc<   |j&                  d |_dfxx   |z  cc<   |>db   }i|d   j.                  |>dF      }|>dD   }d||z  z
  }|it?        j@                  d$      z
  }|j&                  d |dfxx   |z  cc<   |j&                  d |dfxx   |z  cc<   |j&                  |idfxx   |z  cc<   d|j&                  |$df<   d|j&                  d |_df<   d|j&                  d |_df<   dzj&                  |$dsf<   Grd|>dS   z
  }|>dG   }+tK        ||+z  dz
        d[kD  ryHdwz  }H|+z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   |
j)                  |$      }
zj)                  |$      }zsd{}Hd|d.   j&                  |$   z  }|>dD   |z  }||j&                  |$df<   |>dS   |z  }d|z
  }|>dG   }+|Hdwz  }H||+z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   j                  |Hg       j3                  |$       d k(  rrrd|}Hj                  |Hg       j3                  |$       d|>dS   |	z  z
  }|j&                  |$dfxx   |	z  cc<   |j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   rcra|>dD   }||>dS   z  }|>dG   }|j&                  |$dfxx   |	z  cc<   d-}Hj                  |Hg       j3                  |$       dzj&                  |$dsf<   rrd}}Hj                  |Hg       j3                  |$       |>dS   |	z  }d|z
  }||>dG   z  }|j&                  |$dfxx   |	z  cc<   |j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   ss|j&                  |$dfxx   |	z  cc<   dv}Hd~|>v r{|>d~   rvd }#d|>dS   |	z  z
  }||>dG   z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   Hdz  }Hj                  Hg       j3                  |$       dzj&                  |$dsf<   	dk(  s	rrrd}Hd|	z  d|d.   j&                  |$   z  z  }|>dD   |z  }||j&                  |$df<   |>dS   |z  }d|z
  }|>dG   }+|Hdwz  }H||+z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   dzj&                  |$dsf<   j                  |Hg       j3                  |$       
s
s
s
|>dD   }||>dS   z  }|>dG   }d}H||	z  }||z  }||j&                  |$df<   d|z
  }||z  }|j&                  d _dfxx   |z  cc<   d|j&                  d |_df<   |j&                  d |_dfxx   |z  cc<   d|j&                  d |_df<   j                  |Hg       j3                  |$       dzj&                  |$dsf<   j zj                   s D ]N  }Hd|H dtS        |H         D $cg c]  }$t7        |$j5                                c}$ }#|j9                  |#|       P |j                   s%tU        jZ                  ||g      j                         }|S c c}"w c c}?w c c}?w c c}$w c c}?w c c}?w c c}?w c c}$w )N)r-   r+   r.   1yrP   )rS   rR   rt   r   zdiv-adjust-repair-badrF  rs   ry   zNo dividends to checkrN  rd   r   r!  rl  gQ?r   Fri   rj   r&   MbP?rC  r0   rq   rh   rk  rg   r1  Tz'Repaired double-adjustment on div days rP  r%   g?)rel_tol)secondsr3      rk   r  zdiv-too-small)staterf  g      ?g      ?zdiv-too-bigro   zdiv-pre-splitzdiv-too-big-and-pre-splitg?zdiv-too-small-and-pre-split)r   r  divrI  r   
drop_2Dmaxvolumevoldiv_too_bigdiv_too_smalldiv_pre_splitdiv_too_big_and_pre_splitdiv_too_small_and_pre_splitc                     | d   S )Nrf   )r   s    r"   <lambda>z2PriceHistory._fix_bad_div_adjust.<locals>.<lambda><  s
    AfI r$   )keyrd  -_r   div_re  c                 D   t        |       }| j                  |      }g }|j                  d   g}||   j                  d   g}t	        d|      D ]x  }|j                  |   }	||   j                  |   }
|
t        j                  |      z  |k  r#|j                  |	       |j                  |
       b|j                  |       |	g}|
g}z |j                  |       t        j                  dg|z        }d}t        |      D ]  \  }}t        |      }|||||z    ||z  } |S )Nr   r0   rP   )
r   sort_valuesrl   r   rA   r   rK  rw  array	enumerate)r  column	thresholdr  	sorted_dfclusterscurrent_dtscurrents_valsr  r  re  cluster_labelsrY  clusterncs                  r"   cluster_dividendsz;PriceHistory._fix_bad_div_adjust.<locals>.cluster_dividendsK  s6   BAv.IH$??1-.K&v.33A67M1a[ *__Q'',,Q/"''-00I=&&r*!((- OOK0#%$K%(EM* OOK(XXrd1f-NC'1 
7\-.s3r6*r	 "!r$   r  zpresent adjadj_missingadj_exceeds_divdiv_exceeds_adj)r  r  r  phantom   r4         ?g{Gz?zRemoving phantom div(s): )NNrI  r  #      gzAdj LowdeltaadjDeltar'  g333333?gjt?皙?g(\?adj_exceeds_pricesdiv_date_wrongdiv_true_dateg?zdatetime64[ns, UTC])dtype)ry  r  g    ~~Ar   zavg yr yieldr&  gUUUUUU?g333333?gtE]t?)rk  rl  adj_too_small)ri  rk  	ascendingzFixed?ztoo-small div-adjustztoo-big div-adjustztoo-small divz & div-adjustztoo-big divzmissing div-adjustzwrong ex-div datezpre-split divz"too-big div and missing div-adjustztoo-big div & div-adjustzFX was repairedz and FX mixupr  ztoo-big div & pre-splitzdiv-too-big and adj-too-smallz	Repaired r/   )re  ra  )Ir   r   r   r   r   r   rr  r   r   r   rt  r   r   r  r{  infreplacer  r  r   r   rA   r   r   rl   rw  r   r   rq  r   r   r   r   rw  r6   r   rK  r  r   r   r  r*  r   r   	set_indexr   
startswithitemsr   boolbool_r   r  r   rn  r   removebisectbisect_leftrJ  NaTzerosr5   argminr   rv  r  	to_seriesrf  r  total_secondsr   
setdefault)r    r  rB   r   rd   r   r   r  r  currency_dividediv_status_dftoo_big_check_thresholdrC  df_modifiedf_nandf2_nandiv_indicesf_inff_ninfadjClosecloseclose10xf_hugef_adjClose_nafixed_datesr  div_idxprices_beforerf  re  	dt_before	new_close	adj_afteradjrJ  r   r  rS  #div_too_small_improvement_threshold!div_too_big_improvement_thresholddf2_dayr   true_adjustpresent_adjday_movedropsrf  r   r   typical_volatilitydiffspossibilitiespct_zero_volr   div_postSplit_dropdiff_postSplitdiff_fxdiff_fxPostSplitdrop_wo_vol
div_statusprowr  checksr  pre_adjpost_adjdiv_missing_from_adjcloseimplied_div_yielddiv_adj_is_too_smalldiv_adj_exceeds_divr   vphantom_proximity_thresholdr  indicesdts_to_checkdiv_dt
phantom_dt	other_divratio1ratio2
divergence	drop_nextratio_thresholdthis_is_phantomlast_is_phantomlast_divr  	last_dropphantom_div_dt	f_phantomdiv_dtsphantom_div_dtsenddtr_prer_postlookahead_datelookahead_idxlookback_idxfuture_changesf_big_changediv_adj_exceeds_pricesr  r  xdeltas	adjDeltasadjDivr  adjDelta_dropr  f_near1_or_above	pre_splitnear_indices	penaltiesdtireversal_idxcluster_idscidfcr  r  r  
time_diffscluster_checksf_failn_failpct_failtrue_thresholdfals_thresholdf_adj_exceeds_prices	div_yieldpctadj_presentalso_correct_adjdiv_repairsr  r  r  r  rj  ri  rk  r  n_failed_checksadj_correctionrE  correct_div
target_adjtarget_div_pctclose_beforetrue_adjenddt2r  div_truepct_truer]  s                                                                                                                                                                  r"   r   z PriceHistory._fix_bad_div_adjust-  s3    :I22IB<:-bjj(b.A!.C-H-H-J I$$& 7_c_j_jk
KC'113yy{LL0
LCI!!*-6"O!O"']]_ggickk)$C G!!#,,.e*//#5&k [!S(224yy{LL0
LCIhhuoa(K %%rvvw&7899; VF;'002HL))+ERxHx(23F**,#+F#3E#9 8h#67 **,  (C{+33RVVbffW4ErvvNK%G4E
Z%%'E
K(--/CL4E4E4G3GH.1%j.G#g,WdJe.e{*+hhu1h% s;')2r2 	BA!!nG!|HHWQY/M '-*@@Dk"''0CaxT#XaZ-  IIgai0	)'2S8	e 44mTZF[9[2;CGGIw./ #K 0 5 5g >WARARSZA[ [I#sSW1B1B7191M-M'MNC69'l6G6GPQ	6RUX6XCGGI{236:CGGI{23"&K&&syy'9'>'>'@A'	B( {a;[<YSV<Y;Z[CKK:K. s;')2r2 l	@A!!nG7#Bk"''0C!|CL--gai88G 34/01-''#bggi.1668..(DAs5zw/W1B1B7191Mc1Q]bc7|((3C7#e*//':RRW!2!2719!=c!AB!C3w<+<+<WQY+G+K$LL!+.33GAI>WARARSZ[\S\A]]{K5IOZ]`ah]i]m]m  oQoqr{  sF  sF  OP  sQ  pQ  ^R  PRCGG>R	 3 3A >>>KLOSCGG>R	 3 3A >>>KL"7|00;C?''BRBWBWXYBZZHU13w<3D3DWQY3OPT3T`ef7|((3D83u:??7;SSW!2!2719!=d!BC!C3w<+<+<WQY+G+K$LL!+.33GAI>WARARSZ[\S\A]]{K5IOZ]`ah]i]m]m  oQoqr{  sF  sF  OP  sQ  pQ  ^R  PRCGG>R	 3 3A >>>KLOSCGG>R	 3 3A >>>KL"7|00;D@77CSCXCXYZC[[H7|((3c%joog6NN"7|00;gg>N>S>STU>VVHS!# $G(9(9'(BSZ__U\]^U^E_(_!`aVVE]
$(!
C A%#c(GAI.As1uAwqy)#c(E!G,5y1}%'VV"G))%A6??ACJOOTYZ[T[\_D`DiDiDkk%'WWRVVE]%;"Ms
!c(m&8&8&A1&D!vvc(mS&89#c(B3;$!((/#)NO #T)gn'C-!((-)LMN+//3C<$(M %(%KM$s* $'9 9 *qy"3u9~),]5-@)A*-NNSWW)00/R`1ab 44!S(%,,mC-PQ"3z>2"%s?':J&F"G(0 '*K KPTT - 4 4mT[5\ ]/2M/4QS]3]/^,&)99$+.O$OTX#X$1$8$8-X_9`$a$47X$X]a#a$1$8$8B]fv9w$x xx 23 #');";K"Q8#c+o5 +,K"Q"3{?3"%s?':K&G"H(0 '*M MRVV - 4 4oV]5^ _/2M/4QS^3^/_,&)99$+.O$OTX#X$1$8$8/Za9b$c$47X$X]a#a$1$8$8B_hx9y$z"$GCgNJ!%Jv'1J|$#&x=#5#5g#>Jx  2Ju(-J}%*/J'*/J'6;J238=J45=!A% &}:M N!!$;?
1W:--c378,,
|,66v>C$ # "		=#*> ?Yl	@\  I*22Kall66J!KK%002	"> s=)* ,	-A#E*//2G$$Q'B&++A.C!|CL--gai88G +&++GAI6W9J9J7ST99UUG;',,W5G8I8I'8RRH(0G(;% "H,K #k 1#4G#D  #4r'z"B )',$'5J(AJ}%,?J(),@J()!'') -!M)!!dBHH%56+0a(#As++,a(#Au-+.a( )1T!W55+,!!"a%(-A,	-Z 	GG#(i &/&9&9r&B#=*;<=AAqAI557s=)A-hhqk!nG(..q1L E#((+!
q5 - 2 21Q3 7I - 2 21Q3 7Ie*_4	%8HHUi&66 VCZ#fSj/B
vinn,-1LLU^_hUinx{n ~~5"6{$-f$5	#i-/)2J)/J%+
?CM%%j)&;<# E 5 55?DM--j!m<E3EB  %002q#m,- 	EA$$Q'CXXF#O#Ov;D$))!A#.HJ%0E6(--'(,GGPXYbPclopylz  @C  DI  JM  DM  @N  Q`  @`)&166qs;	#i-'&*O&*O/+:@S@STUVWTW@X?C!!.)";< EAM111?D)).!*;<E#	E( 	i  ---%i0I!m4Y1!y.Q4Y&Z&^&^de&^&f%fgI}}'--i81G2Tb3rwwy>2T1UVCz2"/"5"5i"@) ;By221==EGG 34m8T8X8XY[8\\47;CGG 34KK 34m8T8X8XY[8\\47;GKK 34/0CGGBO,"&K$1$6$6r$:M; ;@!!)Y"67)..yq.AMF"i(V$((*..0 =!A%q#m"45 
JA$.ME61u -c 2 7 7! <}S?Q?V?VWX?Y YC.q01!.s!3!8!81!=c@R@W@WXY@Z!Z!OVE#_uF501"4VO=S9TUW9W!.!4!4Q!7EI))&/*AB
J V$((*..0}}))S'N3>>@C
	 s=)* @	eA#E*//2G$$Q'B&++A.C!|CL--gai88G  	 3 3 <<N"..syy.IMs3xz:Mq'"*-L !\..w}QGRRTN*Q.88:nt>S=]=]=__L! '"((<*@*CA*F Fq H!$=!9%*""NFFM|+HH\-/:??A[>AgJ6% x!E(2)5qr*335'
8L8U8U8WWC5&1#'
iL--ab1::<q~?R?RSVTV?W?`?`?bb	IIseY7	 )*GZ01T>gm 1U8==#33Fz*fSj9Auuw"$((1+a.#* #*C,2:,>,C,CC,HM,uVG_5I5I#5N/NN +-VJ-?*?)N393; 0 ),N(;(?(?(C,9/,J,N,Nr,R	$)3JyGWG[G[G]3588<L3Ma3PL'*<'81'<46HHS=N4O	16s<7H1I )RA2>q/C28,,s2CC/2Rx09!C0M09!SVMM@Q0Q)R -/IIi,@7CA7CA59N4:LL4NM$)%2T&[%@ )*%'9'9';AE(>$)G#*L $1#4#4R9J5J#K %*>).&J/EJ+,+9J'(*7J'%N+//3C< %(%KM$s*-:5-A-E-Eb-I*,V488< $'9 9%2<%@%D%DR%H
 *qy"3u9~),]5-@)A)d3h7EIM--b/.AB!'') -!M)!!dBHH%56+0a(#As++,a(#Au-+.a(o-+-99;P+Qa((1T!W55+,!!"a%(-  5 55:JmNcNc:c_d!!-0@"A"J"J"Lm"[\A@	eD 	')9:: 	>A #'') - 2 211 2 =	> %%%-*:*?*?*A*E*E*G)..qq.9M#BqM,A,A'A!BB
 &11#6#4]3#Oi  $I.557 h	Cy)S0B#B'224GGAu~**,H8}q %c]00::<AACFFTTVZop
6@ooa6H
z//23%/"+3C=8H;M+M( 6qz**,002%ll11l5G6 *0HA13GaHNH# X ,,.aV#!A:%%(N%)N'7??:
gVfNg@g?l?l?n +w>GAJSZ[\S]`gh|`}S}D~  DD  DD  DF *-/67K/L/U/U/W,FF#78!#/C(D!E#)A:#n4 "]3G%H%Q%Q%S SA6:M--ad3 (GOO;HY@Z@^@^@` $EN2.v69>>@-0N .2N-@gajRYZnRoFoEtEtEv *- *->137))"a%0+}/D/DDFKM--b2B.BCEGVVM--b/.AB&3B&7&B&B&DG !^338))"a%0 '%(N%)N(?)-),>137))"a%0 !^338))"a%0 %qzr*v{ )),,	>((FFqX!h	T F"'8F'BA$M!3}-. 8"((+#((+}%#.?*@ #E
Ic(C%cME"%m"4K)*;(=%%&77E'*5//2Q+R'SVe'e$'37))"a%08 !#'') - 2 211 2 =a &-*?*??5 %%'4Q'7-Hc:d'dM!$'45P'QM!$MM!$% *../JQR.SMMM56%002 &mF&;&?&?Q&?&GH==iig/::<J i0779: S	C#M)$<c$ABG((5(9G %GH3w<>2r2 K9ll1oXX9..q99+s2Is=7I"3s":"UsCT?U"3s":"UsCT?U%9S%@%^SI]E^" /3 6 O3;O+s2Is=7I /3 6 O3;O "2S!8!RSAQ=R /3 6 O3;O"$&&&)MQAH#a&)M"N#5/Q:N */&#q(O!"&+9>B$56'1,&*/=BB(9$9:'1, )-2*@EB(<$<='1,"a'&/6E2K_#..q"5<<R@*-C.C<N)NFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1& ,%4
&)%j:&=3>K0 _,%(S3}3E-E,S%T
)3c-6H)HFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1#..q"5<<R@$)%(%8
&)%j:&=3>K0),SJ)>%(>%9
&)-&8_,)3k)AFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1#..q"5<<R@$0#..q"5<<R@),SXFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1'/#..q"5<<R@ *-S-?)?FUFK$78NJ8FUFK$78NJ8 ),O(<'*7|'8'8U'D!%j#&\)9#9!.y/B/B1/M!MGVG[$89XE9GVG[$89XE9 { :;sB;34K0;?FUFK$78;?FUFK$7848BL1+ &)3s8^
&)-&8
; 69:TA0A-7+-ENGG(;<N<?CCGG(;<#KK(;<N<?CGKK(;<8<GKKH5,9,>,>r,BM&-ll2&6G&+%(^)<)@)@)D%D
&)%j:&=3>K0),SJ)>%(>%9
&)-&8_,)3k)AFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1#..q"5<<R@$)"{@#..q"5<<R@),s3x/G)GK0OC0FUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1$!%j #CH&)-&8 K0OC0)#..q"5<<R@48BL1$); 7#..q"5<<R@),S/)A%(>%9
)3c-6H)HK0OC0FUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1&? K0OC0+,3<M8N #'C&)SXo-E&FG-4s=7I-INGG(;<N<?CCGG(;<#KK(;<N<?CGKK(;<0A#..q"5<<R@48BL1$)"=5&)/&9c#nBUBYBYZ\B]>]%^
&)%j:&=3>K0),SJ)>%(>%9
&)-&8_,)3k)AFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$7848BL1#..q"5<<R@$] "%j #CH&)-&8;#&#6#+e#33;K0&)Hn)4{)BFUFK$78NJ8;?FUFK$78FUFK$78NJ8;?FUFK$78#..q"5<<R@48BL1WK9Z }}gS	j  	/AaSVKPQN=S#TrC	N#T"UVCKK:K.	/ }}))S'N+668C
y =Zh Lj 5Z 3Uj C0 Ix *NB $Use   +Bt46Bt9Bt9G
Bt>GBt>H Bul2BumBurBur!BuG 	BuG*Bus Buc           
         |j                   r|S t        j                         }d|| j                  d}|dv }|s|S |j	                         }|d   j                         dk7  }|j                         s|j                  d       |S |j                  dt        |d   |   j                                |       d	|j                  vrd
|d	<   t        j                  |      d   D ]o  }|j                  |   }	|j                  |	df   }
|	|j                  d   k(  r7|dv r|dz  }n|dz  }t        |j                   d   |      }|j"                  d|dz    }|j                  d| d|	j%                          d|
d|       |j                  d|j                  d   j%                          d|j                  d   j%                          |       | j'                  ||||
dd      }||j                   d   dz
  k(  r|}|j"                  |dz   d  }|j                   r|j	                         }Kt)        j*                  |j	                         |g      }r |S )Nzsplit-repairrF  r%   r-   r+   r.   ro   r   z%price-repair-split: No splits in datazSplits: rN  r   Fr-   r+   r.   r0   r)   z
split_idx=z
 split_dt=z split=rG  zdf dt range: rW   rP   T)correct_volumer#  )r   r   r   r   r   rr  r   r   r   to_dictr   r   r  rl   r   r   r   r   r   r$  r   r   )r    r  rB   r   r   r  interdaysplit_f	split_idxsplit_dtr   
cutoff_idxdf_pre_splitdf_pre_split_repaireddf_post_cutoffs                  r"   r   z"PriceHistory._fix_bad_stock_splitsR
  so    88I$$& .xVZVaVab
::I]]_^$--/14{{}LL@AIxB~$6w$?$G$G$I JKLT^_bjj(#B{O'*1- 	YIxx	*HFF8^34E288A;& 00Q	Q	RXXa[)4J771Z\2LLL:i[
8==?:K7SXY\R]^fpLqLL=););A)>)C)C)E(Fd<K]K]^`KaKfKfKhJijr|L}$($B$B<QY[fhm  C  VZ$B  %[!RXXa[]**!#A!7!''.99;B$9$D$D$F#WXB1	Y2 	r$   c                 =  ~ |j                   r|S t        j                         }d|| j                  d}	|~d~z  }
|dv }|dv }|r
d}d|	d<   d }nid	}d
|	d<   |d   j	                         dk7  }|j
                  |   j                         t        j                  j                  d      z
  j                         }|j                  d| d|ddd|z  dd|	       g d}|r|dk7  rd}nd}d~cxk  rdk  rn n|j                  d|	       |S |j                         j                  d      }|j
                  j                  !|j
                  j                  |      |_        n9|j
                  j                  |k7  r |j
                  j                  |      |_        |j                   d   }|d   dk(  }|||   j#                         j%                  d      z  }|j'                         xr t)        j*                  |      d   d   dk(  }| }t)        j*                  |t)        j,                  |d      z        d   }t/        |      dk(  rt)        j*                  |      d   }t/        |      dk(  rd }nt1        |d         }d | d!| }|$|d"|j
                  |   j                          dz  }|j                  ||	       |j                         }|j3                  g d#dd$%      }|j5                  dd&i'      }|d&   j#                         }|j'                         rod(|d)<   d*|j6                  |d)f<   |d&   |    d+z  j9                  d,      j9                  d-      d.z   |j6                  | d)f<   |d)   |d&<   |j3                  d)d       n,|d&   d+z  j9                  d,      j9                  d-      d.z   |d&<   d/g}|j3                  |D cg c]	  }||vs| c}dd$%      }|r>|dk7  r9~d0vr5t)        j:                  |d1fd      }d2d/g}||   j	                         }|dk(  } n2t)        j:                  |d3fd      }|}||   j	                         }|dk(  } |j<                  j>                  s|j                         }| j'                         rd|| <   |d/   dk(  } | j'                         rRt)        j@                  t/        |            }!|d4   j	                         |     |d/   j	                         |     z  |!|  <   n'|d4   j	                         |d/   j	                         z  }!|jB                  }"|"t(        jD                  k(  r|j9                  d5      }tG        |j                   d         D ]5  }#|d d |#fxx   |!z  cc<   ||#   |jH                  v s&|||#   xx   |!z  cc<   7 |"t(        jD                  k(  r|j9                  d,      }|dd f   |d d6f   z  |dd  | t)        j,                  | dd      z  }$|$j'                         rd||$<   |r|dk7  rt)        jJ                  |d      }%nt)        jL                  |d      }%t)        jN                  |%      }&|&j'                         rd|%|&<   tQ        ~|
      }'t)        jP                  |%      |'dz
  d7z  dz   k  r=t)        j                  |%      d|'dz
  d7z  dz   z  kD  r|j                  d8| d9|	       |S t)        jR                  |%d:d;g      \  }(})|)|(z
  }*|(d<|*z  z
  }+|)d<|*z  z   },|%|+k\  |%|,k  z  }t)        jT                  |%|         }-t)        jV                  |%|         }.|.|-z  }/|j                  d=|-d>d?|.dd"|/d@z  dAdB|	       dC|/z  }0|r|dk7  r|0dDz  }0|dEv r|0d1z  }0tQ        ~|
      d|0z   k  r0|j                  dF|	       |j                  dG|/ddH|0d|	       |S |%|
z  }1tQ        ~|
      }'|j                  dI|'dJdK|0d|	       |'dz   |0z   d7z  }2|j                  dL|2dJdMd|2z  dJ|	       t)        j:                  t/        |      d      }3|rRt)        j:                  |d3fd      }||   jY                  dd      j	                         }|}|dd f   |d d6f   z  |dd  n|%}|rKtG        t/        |            D ]3  }#||#   }|d d |#f   ||dNz   <   ||dNz      j[                  dD      ||dNz   <   5 n|%|dO<   |dO   j[                  dD      |dO<   ||
z  }1|d|2z  k  }4||2kD  }5t/        |5j                         }6|6dk(  r|5n|5j'                  d      }7|7j'                         r|7 }8t)        j*                  |8      d   }9t/        |4j                         }:|j
                  |:dk(  r|4n|4j'                  d         };t)        j*                  |7      d   D ]  }<|<dz
  }=|j
                  |=   }>|d   j\                  |=   }?|?dk(  rdn|d   j\                  |=dz
     |?z  }@|j                  dP|@d       |rJ|=dz   t/        |      k  r9|d   j\                  |=dz      }A|AdkD  rtQ        @|d   j\                  |=   Az        }@|8d |= j_                         }BtQ        d|BdQz
        }Ct        t/        |9      |CdRz   dz         }D|j\                  |9|C|D    }E|Ej                         }E|;|;|>k\     }Ft/        |F      dkD  rOt        F      }G|G|>k(  rd }HnaEj6                  |>ta        jb                  d      z   Gta        jb                  d      z
   }Hn%Ej6                  |>ta        jb                  d      z   d  }HHHj                   rd }HdS }IdT }JH J|?H      }K |J|Hd   j\                  d   |H      }LtQ        |K|L      d1kD  s|j                  dU|>j                          dV       |6dk(  rd|5|<<   d|5|<d d f<    |4|5z  }|s;|1|dW<   |4|dX<   |5|dY<   |dW   j[                  d1      j9                  d-      |dW<   ||dZ<   ntG        t/        |            D ]o  }#||#   }|1d d |#f   ||d[z   <   ||d[z      j[                  d1      j9                  d-      ||d[z   <   |4d d |#f   ||d\z   <   |5d d |#f   ||d]z   <   |d d |#f   ||d^z   <   q t)        j*                  |      d   D ]  }<|j
                  |<   }>t        t/        |      dz
  |<d1z         }M|je                  d_      rd`}Nn|je                  d.      rda}NndD}NtQ        d|<Nz
        }O|j\                  |OM }P|r|}Qndbg}QQD ]P  }|dbk(  rPdO   |PdZ       j	                         }Rn P|dNz      |P|d^z          j	                         }Rt)        jT                  R      }-t)        jV                  |R      }.|.|-z  }/dC|/z  }0|r|dk7  r|0dDz  }0|dEv r|0d1z  }0|'dz   |0z   d7z  }2|r||dNz      j\                  |<   }S|dO   j\                  |<   }S|S|2k  sSd|2z  kD  s|rC|j                  dc| dd|>j                          de|/daz  dAdf       d|j6                  |>|d^z   f<   |j                  dg|>j                          de|/daz  dAdf       d|j6                  |>dZf<   S  |s-|4|dZ   j	                         z  }4|5|dZ   j	                         z  }5nUtG        t/        |            D ]>  }#||#   }||v s|4d d |#f   ||d^z      z  |4d d |#f<   |5d d |#f   ||d^z      z  |5d d |#f<   @ |4|5z  }|j'                         s|j                  d8| d9|	       |S dR}T|d   j	                         dk7  }U|dhv rUj'                         rt)        j*                  U      d   }Vt)        j*                  |      d   }Wt/        |V      rt/        W      sy Wd d d f   Vz
  }X|Xd6z  }X|XdkD  }Y|Yj'                         r#XY   j                         }Zt        jf                  |      |Zz  }[ti        |[t        j                  j                        r!t        j                  j                  Ti      }2nta        jb                  Ti      }2ti        |2t        j                  j                        r]ti        [t        j                  j                        r9t)        j*                  XZk(        d   d   }<|j
                  |<   }>|>[z   |>|2z   k  }\n[|2k  }\\r|jk                  dj|	       |S |jm                  tn        jp                        r<ts        tG        d|j                   d               |dk<   |j                   d   dz
  |dk   z
  |dl<   |rN||D cg c]  }|d\z   	 c}   j'                  d      ||D cg c]  }|d]z   	 c}   j'                  d      z  }]n|dX   |dY   z  }]]t)        j,                  |]d6      z  t)        j,                  |]d      z  t)        j,                  |]dm      z  t)        j,                  |]d1      z  }]tu        jv                  dnd dod`dpdq      5  |j                  drty        |]         z          d d d        ~fds}^d}_|.|j                   d   dz
  |z
  }`|j                  dt| du|` |	       |rGt)        j:                  |d      }a|r,t)        j:                  |d      }bt)        j:                  |d      }cg dv}dtG        t/        |            D ]o  }#||#   }t)        j*                  |      d   d   }e|rp|m|ek\  rg|d d |#f   }f|5d d |#f   }g|4d d |#f   }h ^|f|d  |g|d  |h|d        }it/        |i      dkD  r5tG        t/        i            D ]  }=i|=   }1|1d   |z   |1d   |z   |1d1   f|i|=<     t)        jz                  t)        j,                  gd6            }jt)        jz                  t)        j,                  hd6            }k|k|jz  }l ^|l`d  |k|`d  |j|`d        }mt/        |m      dkD  rjtG        t/        m            D ]  }=m|=   }1|1d   `z   |1d   |`z   |1d1   f|m|=<     tG        t/        m            D ]  }=m|=   }1||1d   z
  ||1d   z
  |1d1   f|m|=<     i}n|nj}                  m       n ^|d d |#f   |5d d |#f   |4d d |#f         }n|j                  dw| dxn |	       |tG        t/        n      dz
  d6d6      D ]n  }=n|=   }1|j
                  |1d      j                         |k  s,|j                  dy| dz|j
                  |1d       d{|j
                  |1d   dz
      d||	       n|== p t/        n      dkD  sknd|#<   r t_        dD ocg c]  }o|odnd
 c}o      }p|pdk(  rnpdk(  rztG        t/        |            D =cg c]  }=d|=   r|=nd6 }q}=t)        j*                  t)        j~                  |q      d6k7        d   d   }<||<   }r|j                  d}| d~|r d|	       ng d}stG        t/        |            D ]  }#||#   }d|#   }n|ng }nnD ]v  }1|1d1   dk(  r~}t|
}un|
}t~}u_xs tdk  }_|rRd| d| d|j
                  |1d   dz
     j                          d|j
                  |1d      j                          dtd
}vn5d| d| d|j
                  |1d   dz
      d|j
                  |1d       dtd
}v|j                  v|	       s|#xx   |1d   |1d   z
  z  cc<   |j\                  |1d   |1d   |jH                  j                  |      fxx   tz  cc<   |d/k(  r:|j\                  |1d   |1d   |jH                  j                  d4      fxx   tz  cc<   |r!|d2k(  rdb|1d   |1d    n|d/k(  rdc|1d   |1d    da|1d   |1d    y  t_        s      dkD  rWd(}wtG        t/        |            D ]&  }#s|#   dk7  swd(k7  rwdz  }ww||#    ds|#    dz  }w( dw }v|jk                  |v|	       |rbcz  }xt)        j                  |b|c      }y|xj'                         r@|j6                  xdf   uz  j[                         j9                  d,      |j6                  |xdf<   yj'                         rC|j6                  ydf   d7z  uz  j[                         j9                  d,      |j6                  |ydf<   d|3a<   nd}st)        j*                  |      d   d   }e|rU|R|ek\  rL ^||d  |5|d  |4|d        }it/        |i      dkD  r5tG        t/        i            D ]  }=i|=   }1|1d   |z   |1d   |z   |1d1   f|i|=<     t)        jz                  t)        j,                  |5d6            }zt)        jz                  t)        j,                  |4d6            }{|{|zz  }| ^||`d  |{|`d  |z|`d        }mt/        |m      dkD  rjtG        t/        m            D ]  }=m|=   }1|1d   `z   |1d   |`z   |1d1   f|m|=<     tG        t/        m            D ]  }=m|=   }1||1d   z
  ||1d   z
  |1d1   f|m|=<     i}n|nj}                  m       n
 ^||5|4      }n|tG        t/        n      dz
  d6d6      D ]k  }=n|=   }1|j
                  |1d      j                         |k  s,|j                  d|j
                  |1d       d{|j
                  |1d   dz
      d||	       n|== m nD ]  }1|1d1   dk(  r~}t|
}un|
}t~}u_xs tdk  }_|j                  d|1 dt |	       dD ]<  }|j\                  |1d   |1d   |jH                  j                  |      fxx   tz  cc<   > |r:|j\                  |1d   |1d   |jH                  j                  d      fxx   tz  cc<   |rk|jH                  j                  d      }}|j\                  |1d   |1d   |}f   uz  j[                         j9                  d,      |j\                  |1d   |1d   |}f<   d|3|1d   |1d    |1d   |1d   dz
  k(  rB|r'd| d|j
                  |1d      j                          }vnwd| d|j
                  |1d       }vn^|j
                  |1d   dz
     }C|j
                  |1d      }D|r)d| dCj                          dDj                          d}vnd| dC dD d}v|j                  v|	       s|1d   |1d   z
  z  }s t/        n      d1k  rTd}vnD ]L  }1vd|j
                  |1d   dz
     j                          d|j
                  |1d      j                          z  }vN nds d}v|jk                  v|	       |rv_rtd| j                  v rf| j                  d   rW|}td|z  }udD ]  }||xx   tz  cc<    |r|dxx   tz  cc<   |r(|d   uz  j[                         j9                  d,      |d<   |3 }3d|jH                  vrd|d<   |d   j	                         |3z  |d<   |r|d   j#                         }&|&j'                         rG|d   |&    j[                  d      j9                  d,      |j6                  |& df<   |j                         S |d   j[                  d      j9                  d,      |d<   |j                         S c c}w c c}w c c}w # 1 sw Y   cxY wc c}ow c c}=w )Nzprice-change-repairrF  r1  r  r  z
100x errorr  rG  z	bad splitzprice-repair-splitro   ry   r0   rQ  z
start_min=z change=rG  z (rcp=rX   rN  r7  r%   TFr  g      ?z(Split ratio too close to 1. Won't repairr  r   rk   rq   zappears_suspended=z, idx_latest_active=rU   )rj   rs   ro   r   r   )rr   r   Volr"  rT   VolStrNaNg    .Ar   r   rR   ri   )r  rl  r`  rP  rf   r3   rj   r  rP   r&  zNo z
s detected   K   r  z+Estimation of true 1D change stats: mean = z.2fz, StdDev = r  rH  z
% of mean)r)   r  )r+   r.   z>Split ratio too close to normal price volatility. Won't repairz	sd_pct = z  largest_change_pct = z
split_max=z.3fz largest_change_pct=z
threshold=z, threshold_rcp=z 1D %z1D %z- vol_change_pct =    rG   c                    t        j                  |j                  |z
  j                               }||j	                         z  }t        j
                  |       }t        j                  |      t        j                  |      z  }|d   j                         }t        j                  ||z        }t        j                  |||z
  dz  z        }t        j                  |      }| |z
  |z  }	|	S )Nrk   rP  )
r   r  rl   r  r6   exprw  r   rr  sqrt)
rg  r  block	distancesrj  rM  weighted_meanweighted_varianceweighted_stdz_scores
             r"   _calc_volume_zscore_weightedzLPriceHistory._fix_prices_sudden_change.<locals>._calc_volume_zscore_weighted  s     "b(8'G'G'I JI0I ffiZ0G hhw/"&&/AG"8_557F$&FF6G+;$<M(*w&=:PUV9V/V(W%#%77+<#=L  &5EG"Nr$   c                     |d   j                         }t        |      dk(  s|dk(  j                         ryt        j                  |d      }|dk(  ryt        j
                  |      }| |z
  |z  }|S )Nrk   r   r0   )ddofry   )rr  r   r   r   stdrK  )rg  r.  rM  r7  rK  r3  s         r"   _calc_volume_zscorezCPriceHistory._fix_prices_sudden_change.<locals>._calc_volume_zscore  sl    "8_557F6{a'FaK+<+<+> &&a0Ccz 776?D%}3G"Nr$   z'Detected false-positive split error on z, ignoring price droprdownupr  _r_down_up_frJ  r&   rl  zn/az	Unusual 'z' price action @ zM is actually similar to local price volatility, so ignoring (StdDev % mean = z%)zUnusual price action @ )r  rk  r4   z<100x changes are too soon after stock split events, abortingr  i_revzdisplay.max_rowszdisplay.max_columnszdisplay.widthr!  z!price-repair-split: my workings:
c                 d   | d   rNt        j                  |       } d| d<   t        j                  |      }d|d<   t        j                  |      }d|d<   | j                         sg S t        j                  |       d   }g }t	        t        |      dz
        D ]F  }|dz  dk(  sdkD  r|||      rdnd}n|||      rdnd}|j                  ||   ||dz      |f       H t        |      dz  dk7  r>dkD  r||d      rdnd}n||d      rdnd}|j                  |d   t        |       |f       |S )	Nr   Fr0   rP  r1  r   z	1.0/splitrP   )r   rt  r   r  rA   r   rw  )r  f_upf_downtrue_indicesrangesr  r  r   s          r"   map_signals_to_rangeszEPriceHistory._fix_prices_sudden_change.<locals>.map_signals_to_rangesB  sH   tGGAJ!wwt}Q!q	557	88A;q>LF3|,q01 Oq5A:s{)/Q)@gk-3LO-Dk'MM<?LQ4G"MNO < 1$)3;%+L,<%=';C)/R0@)A+wC|B/Q=>Mr$   zidx_latest_active=z, idx_rev_latest_active=)NNNNzcolumn 'z
' ranges: zPruning z range rV  z because too old.z
Potential z detected only in column z(, so treating as false positive (ignore))r   r   r   r   r   gGz?z
Corrected z on col=z range=[:z] m=r_   =r  zCorrected: zPruning range zrange=z m=)rf   rg   rh   ri   rj   rs   z on interval z across intervals rW   z (inclusive)z
Corrected:rV   r  r   )Cr   r   r   r   rr  rl   r   ru  rv  r   r   rt  r   r   r   r   r   r   r   r   r   r  rollr   r   r   r#  r   r   fullr  r  onesr  r   rA   r   r  r  r  r6   
percentilerK  r7  r  r   r   r   r   r   r)  r   r   rq  isEnabledForr  DEBUGr   r   option_contextr   flipextendrw  r  logical_xorr   )r    r  rB   r   changer"  r  r#  r   r  	split_rcpr  multidayfix_type	start_minr  OHLCcorrect_columns_individuallyrC  r  f_no_activityappears_suspendedf_activeidx_latest_activelog_msgdf_workingsfna
debug_colsr  _1d_change_xprice_data_cols
price_dataf_zeror  df_dtyper  f_zero_num_denom_1d_change_denoisedr  	split_maxq1q3iqrlower_boundupper_boundavgsdsd_pctlargest_change_pctr9  rz  sudden_change_repairedrD  rC  
f_up_ndimsf_up_shiftsnf_up_shiftsflat_indicesf_down_ndimsdown_dtsr  r  r  r  vol_change_pctnext_vi_pos_in_flat_indicesr   r   r.  down_dts_fromnext_down_dtblock_afterr4  r8  z_score_afterz_score_after_d1idx_endlookback	idx_startchanges_localr%  clean_changes
big_changethreshold_daysf_splits	indices_A	indices_Bgapsf_posgap_mingap_tdwithin_thresholdr3  rG  
any_m_lt_1idx_rev_latest_activef_correctedf_open_fixedf_close_fixedOHLC_correct_rangesidx_first_fr  f_upjf_downjranges_beforef_rev_downj	f_rev_upjf_revjranges_afterrF  r  r(  idxscoln_correctedrR   m_rcpr   counts_prettyf_open_and_closed_fixedf_open_xor_closed_fixed
f_rev_downf_rev_upf_revcol_locr   s                                                                                                                                 @r"   r$  z&PriceHistory._fix_prices_sudden_change
  s#   88I$$& 5h]a]h]hi
%K	::44#H#6Jx I"H#7Jx >"++-4A!*Y-D-D-R-RYZ-R-[[aacIz)HVCLs6zRUFVVWX`jk/D( ,0(+0( LLC:LVIggi""U"399<<		--k:CIYY\\[(		,,[9CIIIaL Hq(%D	(8(<(<!(<(DD)--/TBHH]4KA4Nq4QST4T!>HHX!0D%DEaH !Q& " 21 5 !Q& $ #$5a$8 9&'8&99MN_M`a(CII&78==?@BBGWJ/hhj!&&'^efow&x!(((E1B(C% %%'779$&K!-2KOOCM*/:5/A3$/G/K.S.STY.Z.a.abg.hkn.nKOOSD(N+!,X!6KXA."-e"4S"8!@!@!G!N!Nu!UX[![KY
!&&4'Oa1J;N'OVW`h&i D(U:M-M 77Aq63/L%g.O_-668J3&F77Aq63/L"O_-668J3&F))#*J::<!$Jv W"::<''#c(#C{+446w?#g,BWBWBY[aZaBbbCLk"++-G0E0E0GGC##rxx#**73Jz''*+ 	7AqsOs"OAw+---OA./36/	7 rxx#**51J%abc+j".??QR!BGGFAA$>>!-0L)*D("$**\"B #%))Lq"Axx+,88:(+% y)	66%&)a-3)>)BBrvvNaGbehmvyzmz  B  mB  EF  mF  fG  HGLL3xj
3:LFI 2RH=B2g39n39n K/4G;4VWgg)!,-VV'*+cB3s);WYZ]V^^`aghmamnq`rr|}  FP  	Q ZD(!#>)"a'"ui 3);#;;LLYakLlLL9VCL0GHZ[^G_`hrLsI  )+y)	z)C0DEWX[D\]eop_'99S@	z)C0@Ys@ST\fg!#S5!9'77Aq63/LT**34==?J"O  *!"#/*SbST2CCL.L'3/0 I#A&)5ad);AgI&)4QwY)?)E)Ea)HAgI&I
 #6K"-f"5";";A">K9$i/ i'_
(!mdq1A??'<L88L1!4Lv||,Lyy<?

PQ
@RSHxx,Q/ c0EYYq\M&&q)&'1f#h-2D2DQqS2IA2M2>#2FGH1s3x ]//!4Fz),^S]=O=OPQ=RU[=[)\2 )5Ra(8(<(<(>%A4r9:#l+U2XaZ8eC!89((* (2 6}%)#&}#5L#r) '+&+ii93F3Fq3I0I,W`WjWjklWmJm&n"'))By/B/B1/E,E,F"GK*{/@/@"&K#
# *%8K%HM':;x;P;U;UVW;XZe'f$
 =*:;a? 'NrwwykYn%op%?(-DI*/DQKGc0H TM+ K"(K $K*3/55a8??FK K3/0 .#A&&'1gAdF#&1!D&&9&?&?&B&I&I%&PAdF#)/1AgI&'+AqDzAeG$&'1gAdF#. 88A;q> )	=C3B#c(1*c!e,G  %""3'As8|,I',,Yw?M+&w =:$1&$9=;M:M$N$W$W$YM$1!G)$<mAdF>S=S$T$]$]$_Mggm,VVM*c%&Z"D 0&!+&>1*a/*&_/AASH	/!,QwY!7!<!<S!AJ!,V!4!9!9#!>J!I-*s9}2L7"LL9QC7H  Ta  bh  il  bl  mp  aq  qs  *t  u:?KOOB$J7"LL+B2779+  N[  \b  cf  \f  gj  [k  km  *n  o7<KOOBG45=)	=T ,k#.7799F+c*3355D3/0 B#A&
?#)!Q$<+af2E#EF1a4L!%adk!D&.A!ADAJ	B
 TMuuwLL3xj
3:LFI ~&//1S8]"x||~*1-IAIy>YQW%	1DBJD1HEyy{u+//+55h?'Ifi&=&=&K&KL ) 7 7 E E> E ZI ) 3 3 HIi)@)@)N)NOT^_egpg~g~  hM  hM  UN((4=1!4Q7C3B(*VY'G$'-	'9$#KK ^fpKqIw}}-#E![->->q-A$BCK#.#4#4Q#7#9K<L#LK +&:'Fa'	'FGKKQRKSVat~bopcdejcjb  WA  WE  WE  KL  WE  WM  M&v.T1BB"''(B"77"''(A:NNQSQXQXYaceQffikipipqy{|i}}H""#5t=RTVXgimn eF[YaMbIccde	B 
($&HHQK!O6G$G!LL-.?-@@XYnXop  yCL  D'''!U+K  "wwq%0 "5 1":3t9% -4G hhqk!nQ/$*;*GL]alLl 1a4B AJE$QTlG$9"=N=O:PRWXiXjRkmt  vG  vH  nI  %JM=)A-!&s='9!: jA -a 0A01!7H0H!A$QbJbdefgdh/iM!,j #%''"''%*<"=K "(< =I&4F#8@U@V9WYbcxcyYz  }H  I^  I_  }`  $aL<(1,!&s<'8!9 qA ,QA/0t6K/KQqTTiMiklmnko.pLOq "'s<'8!9 EA ,QA/01vq1vqt.DLOE +FMM,/21QT7DAJqRStUFxs*VH=ZP("3v;q="b9 *"1I99QqT?//1I="LL8A3gcii!o=NbQTQZQZ[\]^[_`a[aQbPcct)u  ~HL  I &q		* v;?-3'*[-4^ <OPqam2PQEz!EJ3t9EUV03;VVhhrxx~34Q7:3iz(3LSEQyz  CM  N (s4y) 6AQA03F~!## 6Q47? %A$-E )A$)E%/%;1t8
#$.xj8CIIVWXYVZ[\V\L]LbLbLdKeefgjgpgpqrstqugvg{g{g}f~  C  DE  FI  CJ  #KC$.xj8CIIVWXYVZ[\V\L]K^^_`c`i`ijklmjn`o_pptuvwzt{"|CS
;#A!A$qt)31adCKK,?,?,B!BCqHC<HHQqT!A$Y0C0CK0P%PQUVVQ) F{:>QqT!A$ 7!"g;?ad1Q4 815AaD1./66: {#a'$&M"3t9- L&q>Q.,2 - 5)Qy+a.9I-KKM	L
 (7CKK:K6*6*F'*,..}*U'*..0BE''JackJkBlotBtA{A{A}  BE  BE  FK  BLCGG3X=>*..0BE''JackJkBlorBruzBz  BB  BB  BD  BK  BK  LQ  BRCGG3X=>26";/ K((1+a.+K &7&CHY]hHh !6a8I8J6KTRcRdMegmn  oA  hB  !C}%)"3}#56 f)!,,-aD3D,DadM^F^`abc`d+ea(f  WWRWWT2%67
7727762#67 :-4U;P;Q5RT\]r]sTt  wA  BW  BX  wY   Z|$q("3|#45 m(O+,Q42G+G1PeIeghijgk*lQm #3|#45 A(O+,QqT61QqT61Q4*@QA 'l+.q$?$s6{1}b"5 &Aq	Ayy1++-	9~cii!o5FbSTUVSWXYSYIZH[[l%mu  A"1I	&
  +Q47?A%E!A!E'31t8
vaSA3/zBF EAHHQqT!A$Y(;(;A(>>?1D?E#HHQqT!A$Y(;(;K(HHIQNI!!kk11(;G47HHQqT!A$Y=O4PSX4X3_3_3a3h3hin3oCHHQqT!A$Y/048&qtAaD1Q41Q4!8# *8*M#))AaD/BVBVBXAYZ *8*M#))AaD/ARS  IIadQh/E))AaD/C *8*4Fuzz|nTXY\YaYaYcXddpq *8*4FugTRUQVVbcS
3qtad{*?+B 6{a" VAQsyy1a05578SYYqt_=Q=Q=S<TUUCV $K=2KK:K.: "T%;%;;@V@VWi@j F
F  AFaKF #$)$!%(]U%:$A$A$C$J$J5$QCM*@)@&ckk)$C{+4469OOKx=%%'Dxxz*-h-*>*D*DQ*G*N*Nu*Uh' ~~ !$H 3 3A 6 = =e DH~~W (Pr
 (Gbe eJ Q
 Ws>   	AzAzEAz#FAz(H+!Az-U&Az:VAz?z-Az7r  )r6   r%   F)r6   F)r6   )rP   )F)FFF)__name__
__module____qualname__r#   r   log_indent_decoratorr	   r   r   r  r  r
   r   r  r   r  r  r  r'  r   r  r   r   r   r  r  r   r   r   r   r$  ro  r$   r"   r   r      s    & +deT eE%"	~ (*||	~  ~@.r|| . +5 & &0a299 aeryy e^		 ^299 05",, 5n A  AF8t%N    X  Xt u  u  @  @D o  ob b  bH! :  :x }
   }
 r$   r   )!yfinance._httpr   mathr   r  r8  r   dateutilru  r  numpyr   pandasr   r   r   r   yfinancer   yfinance.configr   yfinance.constr   r   r	   r
   yfinance.exceptionsr   r   r   r   r   r   ro  r$   r"   <module>r     sA    &           $ S S  |4  |4 r$   