import yfinance as yf import pandas as pd from datetime import timedelta def calculate_ratio(stock: yf.Ticker, ps_series: pd.Series) -> pd.Series: """ Calculate ps_series / share_price * 100 for each date in ps_series. Uses the full 5y price history fetched once, then asof() lookup — finds the last available trading day on or before each target date, capped at today so future fiscal year-ends don't return None. """ if ps_series.empty: return pd.Series([], dtype=float) try: hist = stock.history(period='5y') if hist.empty: return pd.Series([None] * len(ps_series), index=ps_series.index) # Strip timezone so index comparison works cleanly close = hist['Close'].copy() close.index = close.index.tz_localize(None) if close.index.tzinfo else close.index except Exception as e: print(f"calculate_ratio: could not fetch history: {e}") return pd.Series([None] * len(ps_series), index=ps_series.index) today = pd.Timestamp.today().normalize() ratio_results = [] for date, ps_val in ps_series.items(): try: # Cap future dates at today so asof() doesn't return NaN lookup = min(pd.Timestamp(date).normalize(), today) price = close.asof(lookup) if pd.isna(price) or price == 0: ratio_results.append(None) else: ratio_results.append((ps_val / price) * 100) except Exception: ratio_results.append(None) return pd.Series(ratio_results, index=ps_series.index) def get_data(stock): # Initialize all variables to an empty Series EPS = pd.Series([]) DPS = pd.Series([]) EPS_RATIO = pd.Series([]) DPS_RATIO = pd.Series([]) TR = pd.Series([]) NI = pd.Series([]) TA = pd.Series([]) TD = pd.Series([]) TE = pd.Series([]) TL = pd.Series([]) try: EPS = stock.financials.T['Basic EPS'].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di EPS: {e}") try: DPS = stock.dividends.resample('YE').sum().sort_index(ascending=True) DPS = DPS.iloc[:-1].tail(5) DPS.index = DPS.index.date except Exception as e: print(f"Errore durante il recupero di DPS: {e}") try: EPS_RATIO = calculate_ratio(stock, EPS) except Exception as e: print(f"Errore durante il recupero di EPS_RATIO: {e}") try: DPS_RATIO = calculate_ratio(stock, DPS) except Exception as e: print(f"Errore durante il recupero di DPS_RATIO: {e}") try: TR = stock.financials.T['Total Revenue'].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di TR: {e}") try: NI = stock.financials.T['Net Income'].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di NI: {e}") try: TA = stock.balance_sheet.T['Total Assets'].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di TA: {e}") try: TD = stock.balance_sheet.T['Total Debt'].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di TD: {e}") try: TE = stock.balance_sheet.T['Total Equity Gross Minority Interest'].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di TE: {e}") try: bs_t = stock.balance_sheet.T tl_col = 'Total Liabilities Net Minority Interest' if 'Total Liabilities Net Minority Interest' in bs_t.columns else 'Total Non Current Liabilities Net Minority Interest' TL = bs_t[tl_col].dropna().sort_index(ascending=True).tail(5) except Exception as e: print(f"Errore durante il recupero di TL: {e}") """ EPS = stock.financials.T['Basic EPS'].dropna().sort_index(ascending=True).tail(5) DPS = stock.dividends.resample('YE').sum().sort_index(ascending=True) DPS = DPS.iloc[:-1].tail(5) DPS.index = DPS.index.date EPS_RATIO = calculate_ratio(stock, EPS) DPS_RATIO = calculate_ratio(stock, DPS) TR = stock.financials.T['Total Revenue'].dropna().sort_index(ascending=True).tail(5) NI = stock.financials.T['Net Income'].dropna().sort_index(ascending=True).tail(5) TA = stock.balance_sheet.T['Total Assets'].dropna().sort_index(ascending=True).tail(5) TD = stock.balance_sheet.T['Total Debt'].dropna().sort_index(ascending=True).tail(5) TE = stock.balance_sheet.T['Total Equity Gross Minority Interest'].dropna().sort_index(ascending=True).tail(5) #TL = stock.balance_sheet.T['Total Non Current Liabilities Net Minority Interest'].dropna().sort_index(ascending=True).tail(5) """ # print(EPS) # print(DPS) # print(EPS_RATIO) # print(DPS_RATIO) # print(TR/1000000) # print(NI/1000000) # print(TA/1000000) # print(TD/1000000) # print(TE/1000000) # print(TL/1000000) return EPS, DPS, EPS_RATIO, DPS_RATIO, TR, NI, TA, TD, TE, TL #print(get_data(yf.Ticker('BCAT')))