Spaces:
Sleeping
Sleeping
| 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'))) |