From d44eff40653b0f58a8913f1424d33dc091f9ad46 Mon Sep 17 00:00:00 2001 From: Value Raider Date: Fri, 22 Dec 2023 20:29:04 +0000 Subject: [PATCH] Fix 'Unalignable' error in reconstruct_intervals --- yfinance/base.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/yfinance/base.py b/yfinance/base.py index 2741c1108..f1c526c7e 100644 --- a/yfinance/base.py +++ b/yfinance/base.py @@ -694,7 +694,7 @@ def _reconstruct_intervals_batch(self, df, interval, prepost, tag=-1): f_tag = df_block_calib['Adj Close'] == tag if f_tag.any(): div_adjusts = df_block_calib['Adj Close'] / df_block_calib['Close'] - # The loop below assumes each 1d repair is isoloated, i.e. surrounded by + # The loop below assumes each 1d repair is isolated, i.e. surrounded by # good data. Which is case most of time. # But in case are repairing a chunk of bad 1d data, back/forward-fill the # good div-adjustments - not perfect, but a good backup. @@ -706,26 +706,30 @@ def _reconstruct_intervals_batch(self, df, interval, prepost, tag=-1): if df_new.loc[dt, "Dividends"] != 0: if idx < n - 1: # Easy, take div-adjustment from next-day - div_adjusts[idx] = div_adjusts.iloc[idx + 1] + div_adjusts.iloc[idx] = div_adjusts.iloc[idx + 1] else: # Take previous-day div-adjustment and reverse todays adjustment div_adj = 1.0 - df_new_calib["Dividends"].iloc[idx] / df_new_calib['Close'].iloc[ idx - 1] - div_adjusts[idx] = div_adjusts.iloc[idx - 1] / div_adj + div_adjusts.iloc[idx] = div_adjusts.iloc[idx - 1] / div_adj else: if idx > 0: # Easy, take div-adjustment from previous-day - div_adjusts[idx] = div_adjusts.iloc[idx - 1] + div_adjusts.iloc[idx] = div_adjusts.iloc[idx - 1] else: # Must take next-day div-adjustment - div_adjusts[idx] = div_adjusts.iloc[idx + 1] + div_adjusts.iloc[idx] = div_adjusts.iloc[idx + 1] if df_new_calib["Dividends"].iloc[idx + 1] != 0: - div_adjusts[idx] *= 1.0 - df_new_calib["Dividends"].iloc[idx + 1] / \ + div_adjusts.iloc[idx] *= 1.0 - df_new_calib["Dividends"].iloc[idx + 1] / \ df_new_calib['Close'].iloc[idx] f_close_bad = df_block_calib['Close'] == tag + div_adjusts = div_adjusts.reindex(df_block.index, fill_value=np.nan).ffill().bfill() df_new['Adj Close'] = df_block['Close'] * div_adjusts if f_close_bad.any(): - df_new.loc[f_close_bad, 'Adj Close'] = df_new['Close'][f_close_bad] * div_adjusts[f_close_bad] + f_close_bad_new = f_close_bad.reindex(df_new.index, fill_value=False) + div_adjusts_new = div_adjusts.reindex(df_new.index, fill_value=np.nan).ffill().bfill() + div_adjusts_new_np = f_close_bad_new.to_numpy() + df_new.loc[div_adjusts_new_np, 'Adj Close'] = df_new['Close'][div_adjusts_new_np] * div_adjusts_new[div_adjusts_new_np] # Check whether 'df_fine' has different split-adjustment. # If different, then adjust to match 'df'