Skip to content

Commit 2a6102f

Browse files
authored
state whether price adjustment was applied, on every return path
history() defaults to auto_adjust=True. When adjustment raises, the exception is swallowed on shipped defaults (config.debug.hide_exceptions=True) and the logger is off (config.debug.logging=False), so the caller receives raw prices under the same 'Close' column with no signal. Records on the frame whether adjustment was actually applied, via DataFrame.attrs. history() has four returns - three early utils.empty_df() paths and the success path - and all four are stamped, so the key is always present and callers never need to guard with .get(). Non-breaking: no signature, column, dtype or index change. attrs was previously unused anywhere in yfinance.
1 parent 686a031 commit 2a6102f

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

‎yfinance/scrapers/history.py‎

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,20 @@ def history(self, period=period_default, interval="1d",
149149
raise_errors : bool
150150
If True, then raise errors as Exceptions instead of logging.
151151
"""
152+
153+
def _stamp(frame, applied=False):
154+
"""Record whether price adjustment was actually applied.
155+
156+
A caller cannot otherwise tell: on success 'Close' holds the
157+
adjusted value, and when adjustment is requested but raises, the
158+
exception is swallowed by default (config.debug.hide_exceptions)
159+
and 'Close' holds the raw value under the same column name.
160+
Stamped on every return path so the key is always present.
161+
"""
162+
frame.attrs['adjustment_requested'] = bool(auto_adjust or back_adjust)
163+
frame.attrs['auto_adjust'] = bool(auto_adjust) and applied
164+
frame.attrs['back_adjust'] = bool(back_adjust) and applied
165+
return frame
152166
logger = utils.get_yf_logger()
153167

154168
if raise_errors:
@@ -180,7 +194,7 @@ def history(self, period=period_default, interval="1d",
180194
raise _exception
181195
else:
182196
logger.error(err_msg)
183-
return utils.empty_df()
197+
return _stamp(utils.empty_df())
184198
if period == 'ytd':
185199
start = _datetime.date(pd.Timestamp.now('UTC').tz_convert(tz).year, 1, 1)
186200
else:
@@ -205,7 +219,7 @@ def history(self, period=period_default, interval="1d",
205219
raise _exception
206220
else:
207221
logger.error(err_msg)
208-
return utils.empty_df()
222+
return _stamp(utils.empty_df())
209223

210224
if start:
211225
start_dt = utils._parse_user_dt(start, tz)
@@ -372,7 +386,7 @@ def history(self, period=period_default, interval="1d",
372386
logger.error(err_msg)
373387
if self._reconstruct_start_interval is not None and self._reconstruct_start_interval == interval:
374388
self._reconstruct_start_interval = None
375-
return utils.empty_df()
389+
return _stamp(utils.empty_df())
376390

377391
# Select useful info from metadata
378392
quote_type = self._history_metadata["instrumentType"]
@@ -591,11 +605,14 @@ def history(self, period=period_default, interval="1d",
591605
df = df.sort_index()
592606

593607
# Auto/back adjust
608+
adjustment_applied = False
594609
try:
595610
if auto_adjust:
596611
df = utils.auto_adjust(df)
612+
adjustment_applied = True
597613
elif back_adjust:
598614
df = utils.back_adjust(df)
615+
adjustment_applied = True
599616
except Exception as e:
600617
if raise_errors or (not YfConfig.debug.hide_exceptions):
601618
raise
@@ -640,7 +657,9 @@ def history(self, period=period_default, interval="1d",
640657

641658
if self._reconstruct_start_interval is not None and self._reconstruct_start_interval == interval:
642659
self._reconstruct_start_interval = None
643-
return df
660+
661+
# Stamped last so no later reshaping can drop it.
662+
return _stamp(df, adjustment_applied)
644663

645664
def _get_history_cache(self, period="max", interval="1d", repair=False) -> pd.DataFrame:
646665
cache_key = (interval, period, repair)

0 commit comments

Comments
 (0)