aboutsummaryrefslogtreecommitdiff
path: root/services/data_service.py
diff options
context:
space:
mode:
Diffstat (limited to 'services/data_service.py')
-rw-r--r--services/data_service.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/services/data_service.py b/services/data_service.py
index 3de2484..acc935f 100644
--- a/services/data_service.py
+++ b/services/data_service.py
@@ -158,6 +158,28 @@ def get_insider_transactions(ticker: str) -> pd.DataFrame:
return pd.DataFrame()
+@st.cache_data(ttl=3600)
+def get_ebitda_from_income_stmt(ticker: str) -> float | None:
+ """Return the most recent annual EBITDA from the income statement.
+
+ yfinance's info['ebitda'] can be badly wrong for companies with large
+ stock-based compensation (e.g. it may deduct SBC, leaving near-zero EBITDA
+ even when the income statement EBITDA line is hundreds of millions).
+ The income statement 'EBITDA' row is the standard EBIT + D&A figure.
+ """
+ try:
+ t = yf.Ticker(ticker.upper())
+ inc = t.income_stmt
+ for label in ("EBITDA", "Normalized EBITDA"):
+ if label in inc.index:
+ val = inc.loc[label].iloc[0]
+ if val is not None and pd.notna(val):
+ return float(val)
+ return None
+ except Exception:
+ return None
+
+
@st.cache_data(ttl=900)
def get_options_chain(ticker: str) -> dict:
"""Return options chain data for the nearest available expirations.