Fix syntax error and dataframe column extraction in yfinance batch fetch
This commit is contained in:
+20
-11
@@ -212,12 +212,20 @@ class ForexDataProvider:
|
||||
else:
|
||||
period = f"{lookback_days}d"
|
||||
|
||||
for attempt in range(3):
|
||||
try:
|
||||
df = yf.download(
|
||||
yf_symbol, interval=yf_interval, period=period,
|
||||
progress=False, auto_adjust=False, threads=False,
|
||||
)
|
||||
if df is None or df.empty:
|
||||
if df is not None and not df.empty:
|
||||
break
|
||||
time.sleep(1.0)
|
||||
except Exception as e:
|
||||
if attempt == 2:
|
||||
raise DataUnavailableError(f"yfinance fetch failed for {symbol} {timeframe.value}: {e}")
|
||||
time.sleep(1.0)
|
||||
else:
|
||||
raise DataUnavailableError(f"No data returned for {symbol}")
|
||||
|
||||
if isinstance(df.columns, pd.MultiIndex):
|
||||
@@ -242,8 +250,6 @@ class ForexDataProvider:
|
||||
|
||||
logger.info(f"[yf live] {yf_symbol} {timeframe.value}: {len(df)} bars, last close={df['Close'].iloc[-1]:.5f}")
|
||||
return df
|
||||
except Exception as e:
|
||||
raise DataUnavailableError(f"yfinance fetch failed for {symbol} {timeframe.value}: {e}")
|
||||
|
||||
def _batch_fetch_timeframe(self, symbols: List[str], timeframe: Timeframe, lookback_days: int) -> None:
|
||||
if not _YF_AVAILABLE:
|
||||
@@ -270,14 +276,20 @@ class ForexDataProvider:
|
||||
else:
|
||||
period = f"{lookback_days}d"
|
||||
|
||||
for attempt in range(3):
|
||||
try:
|
||||
df_multi = yf.download(
|
||||
" ".join(yf_symbols), interval=yf_interval, period=period,
|
||||
progress=False, auto_adjust=False, threads=True, group_by="ticker"
|
||||
progress=False, auto_adjust=False, threads=False, group_by="ticker"
|
||||
)
|
||||
|
||||
if df_multi is None or df_multi.empty:
|
||||
logger.warning(f"Batch fetch empty for {timeframe.value}")
|
||||
if df_multi is not None and not df_multi.empty:
|
||||
break
|
||||
time.sleep(1.0)
|
||||
except Exception as e:
|
||||
logger.warning(f"Batch fetch attempt {attempt+1} failed for {timeframe.value}: {e}")
|
||||
time.sleep(1.0)
|
||||
else:
|
||||
logger.warning(f"Batch fetch empty for {timeframe.value} after 3 attempts")
|
||||
return
|
||||
|
||||
if df_multi.index.tz is None:
|
||||
@@ -292,7 +304,7 @@ class ForexDataProvider:
|
||||
if len(yf_symbols) == 1:
|
||||
df_sym = df_multi.copy()
|
||||
if isinstance(df_sym.columns, pd.MultiIndex):
|
||||
df_sym.columns = df_sym.columns.get_level_values(0)
|
||||
df_sym.columns = df_sym.columns.get_level_values(1)
|
||||
else:
|
||||
if yf_sym in df_multi.columns.get_level_values(0):
|
||||
df_sym = df_multi[yf_sym].copy()
|
||||
@@ -326,9 +338,6 @@ class ForexDataProvider:
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to process batch data for {symbol}: {e}")
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"Batch fetch failed for {timeframe.value}: {e}")
|
||||
|
||||
def _validate_and_clean(
|
||||
self, df: pd.DataFrame, symbol: str, timeframe: Timeframe
|
||||
) -> pd.DataFrame:
|
||||
|
||||
Reference in New Issue
Block a user