vibetatest / fin_data.py
gbarone77's picture
Upload 5 files
a7e3b99 verified
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')))