diff options
| author | Tyler <tyler@tylerhoang.xyz> | 2026-03-30 12:14:56 -0700 |
|---|---|---|
| committer | Tyler <tyler@tylerhoang.xyz> | 2026-03-30 12:14:56 -0700 |
| commit | bfa2ad1e839b88313a2abeae26ddcd7e9beacd85 (patch) | |
| tree | f22802f89d15206083807b45eae1b23716cc9359 /components | |
| parent | 425874931ffd3e3cef60262f7f0b7cb678629278 (diff) | |
Fix forward estimates field name mismatch with FMP stable API
FMP stable /analyst-estimates returns revenueAvg, epsAvg, ebitdaAvg, etc.
but the code was looking for estimatedRevenueAvg, estimatedEpsAvg, etc.
Updated _build_estimates_table and the EPS chart to read both field name
variants so the Forward Estimates tab now renders correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'components')
| -rw-r--r-- | components/valuation.py | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/components/valuation.py b/components/valuation.py index 4dea754..5536818 100644 --- a/components/valuation.py +++ b/components/valuation.py @@ -739,14 +739,15 @@ def _render_forward_estimates(ticker: str): table = [] for row in sorted(rows, key=lambda r: str(r.get("date", ""))): date = str(row.get("date", ""))[:7] - rev_avg = row.get("estimatedRevenueAvg") - rev_lo = row.get("estimatedRevenueLow") - rev_hi = row.get("estimatedRevenueHigh") - eps_avg = row.get("estimatedEpsAvg") - eps_lo = row.get("estimatedEpsLow") - eps_hi = row.get("estimatedEpsHigh") - ebitda_avg = row.get("estimatedEbitdaAvg") - num_analysts = row.get("numberAnalystEstimatedRevenue") or row.get("numberAnalysts") + # FMP stable endpoint uses revenueAvg / epsAvg (no "estimated" prefix) + rev_avg = row.get("revenueAvg") or row.get("estimatedRevenueAvg") + rev_lo = row.get("revenueLow") or row.get("estimatedRevenueLow") + rev_hi = row.get("revenueHigh") or row.get("estimatedRevenueHigh") + eps_avg = row.get("epsAvg") or row.get("estimatedEpsAvg") + eps_lo = row.get("epsLow") or row.get("estimatedEpsLow") + eps_hi = row.get("epsHigh") or row.get("estimatedEpsHigh") + ebitda_avg = row.get("ebitdaAvg") or row.get("estimatedEbitdaAvg") + num_analysts = row.get("numAnalystsRevenue") or row.get("numAnalystsEps") or row.get("numberAnalystEstimatedRevenue") or row.get("numberAnalysts") table.append({ "Period": date, "Rev Low": fmt_large(rev_lo) if rev_lo else "—", @@ -766,9 +767,9 @@ def _render_forward_estimates(ticker: str): fwd_dates, fwd_eps = [], [] for row in sorted(rows, key=lambda r: str(r.get("date", ""))): date = str(row.get("date", ""))[:7] - eps = row.get("estimatedEpsAvg") - eps_lo = row.get("estimatedEpsLow") - eps_hi = row.get("estimatedEpsHigh") + eps = row.get("epsAvg") or row.get("estimatedEpsAvg") + eps_lo = row.get("epsLow") or row.get("estimatedEpsLow") + eps_hi = row.get("epsHigh") or row.get("estimatedEpsHigh") if eps is not None: fwd_dates.append(date) fwd_eps.append(float(eps)) @@ -787,10 +788,10 @@ def _render_forward_estimates(ticker: str): if fwd_dates: # Low/high band - fwd_lo = [float(r["estimatedEpsLow"]) for r in sorted(rows, key=lambda r: str(r.get("date", ""))) - if r.get("estimatedEpsLow") is not None] - fwd_hi = [float(r["estimatedEpsHigh"]) for r in sorted(rows, key=lambda r: str(r.get("date", ""))) - if r.get("estimatedEpsHigh") is not None] + fwd_lo = [float(r.get("epsLow") or r.get("estimatedEpsLow")) for r in sorted(rows, key=lambda r: str(r.get("date", ""))) + if (r.get("epsLow") or r.get("estimatedEpsLow")) is not None] + fwd_hi = [float(r.get("epsHigh") or r.get("estimatedEpsHigh")) for r in sorted(rows, key=lambda r: str(r.get("date", ""))) + if (r.get("epsHigh") or r.get("estimatedEpsHigh")) is not None] if fwd_lo and fwd_hi and len(fwd_lo) == len(fwd_dates): fig.add_trace(go.Scatter( |
