feat: FF→FRED series mapping + MacroSeries visualization page
Backend:
- ff_calendar: add series_id column (migration) + FF_TO_FRED mapping dict
(NFP→PAYEMS, CPI→CPIAUCSL, Jobless Claims→ICSA, GDP→GDPC1, FEDFUNDS, PCE)
- import_csv + sync_live now populate series_id on each FF event
- New GET /api/eco/series/{id}/history: FRED time series + linked FF events
(surprises, forecast, actual) merged by date — enables context queries
Frontend:
- New MacroSeriesPage.tsx: sidebar with 11 FRED series grouped by category,
recharts ComposedChart with area + z-score surprise reference lines (|z|≥1.5),
KPI cards (latest/prev/min/max), FF events table (actual vs forecast coloring),
z-score bar chart for recent surprises, range selector (1Y/2Y/5Y/10Y/All)
- Route /macro-series + Sidebar entry "Macro Series"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -696,6 +696,7 @@ def init_db():
|
||||
actual_value TEXT,
|
||||
forecast_value TEXT,
|
||||
previous_value TEXT,
|
||||
series_id TEXT,
|
||||
detail TEXT,
|
||||
source TEXT DEFAULT 'ff_cache',
|
||||
fetched_at TEXT DEFAULT (datetime('now')),
|
||||
@@ -705,8 +706,14 @@ def init_db():
|
||||
c.execute("CREATE INDEX IF NOT EXISTS idx_ff_date ON ff_calendar(event_date)")
|
||||
c.execute("CREATE INDEX IF NOT EXISTS idx_ff_currency ON ff_calendar(currency)")
|
||||
c.execute("CREATE INDEX IF NOT EXISTS idx_ff_impact ON ff_calendar(impact)")
|
||||
c.execute("CREATE INDEX IF NOT EXISTS idx_ff_series ON ff_calendar(series_id)")
|
||||
except Exception:
|
||||
pass
|
||||
# Migration: add series_id column if missing (existing deployments)
|
||||
try:
|
||||
c.execute("ALTER TABLE ff_calendar ADD COLUMN series_id TEXT")
|
||||
except Exception:
|
||||
pass # Column already exists
|
||||
|
||||
# ── Specialist Desks ───────────────────────────────────────────────────────
|
||||
c.execute("""CREATE TABLE IF NOT EXISTS specialist_reports (
|
||||
|
||||
Reference in New Issue
Block a user