Spaces:
Sleeping
Sleeping
Commit History
-
Refresh data to 2026-05-25; add Name + SGX link to scores tables
Palani-UnisonPipelines re-run (backfill 2026-05-02..24, compute_metrics, score_pipeline). EQDP Brief and Tracker now show stock name and a clickable SGX link (investors.sgx.com/market/security-details/stocks/<code>) for each row.be9a340
-
Populate the full data layer + 2 explainer pages
Palani-UnisonPipelines now run end-to-end on Python 3.12 / DuckDB 1.5.2: - tickers 72 - managers 9 - prices_daily 109,526 (2020-01-02 → 2026-05-01) - factor_returns 1,590 - betas 69 (252-day pre-event windows) - liquidity_metrics 101,466 (Amihud + 60-day rolling) - abnormal_returns 4,346 (4 events × CAPM) - bootstrap_cis 12 (5,000-rep block bootstrap) - candidate_scores 72 (top: 5DD, E28, AWX) Headline DiD δ (treated − control, 5/95 CI): announcement [-0.0083, +0.0001] null tranche_1 [-0.0255, +0.0013] null tranche_2 [+0.0021, +0.0113] positive-significant ★ expansion [-0.0018, +0.0195] null Bug fixes uncovered along the way: - requirements.txt: bumped duckdb to 1.5+ (1.1.3 had a bug where DEFAULT uuid() fired on UPDATE), bumped yfinance to 1.3.0+ (0.2.x is broken against Yahoo's bot-detection), commented out tfcausalimpact (0.0.16 needs Py<3.12; 0.0.18 pins pandas<=2.2 which clashes with ou…5512a2f -
Backfill the DuckDB + harden the shim
Palani-Unison- pipelines.backfill ran 2020-01-01 → 2026-05-01 against the new DuckStore: 72 tickers, 9 managers, 109,526 prices_daily rows, 0 fetch failures. data/eqdp.duckdb is now 14.7 MB. - src/store.py: _Insert.execute now appends RETURNING * and collects the server-generated rows so callers can read default-populated columns (e.g. pipeline_runs.run_id from a UUID default). - db/schema_duckdb.sql: pipeline_runs.run_id gains DEFAULT uuid(). - Verified end-to-end: streamlit_app/lib/store loaders return populated data when the pipeline is not holding the writer lock.4c2c44d -
Swap Supabase for DuckDB-in-repo
Palani-UnisonPipelines now write to a single DuckDB file at data/eqdp.duckdb committed to the repo. Streamlit Cloud reads it directly — no managed database, no secrets, no auth. Mechanics: - src/store.py: DuckStore with a supabase-py-compatible chainable API (table().upsert/insert/update/select.eq/gte/lte/order/range/limit.execute, count="exact" supported). Every pipeline call site keeps working unchanged. - src/db.py: get_supabase() now returns the DuckStore. get_pg_conn() returns a raw DuckDB connection. - streamlit_app/lib/store.py: read-only DuckDB reader. lib/supabase.py removed; every page import flipped to lib.store. - db/schema_duckdb.sql: DuckDB-compatible schema. Drops auth.users, user_profiles, engagement_events, RLS, and the generated dollar_volume column (computed in pipelines instead). - scripts/init_duckdb.py: idempotent schema apply. - requirements.txt: drops supabase + psycopg2-binary. - .gitignore: whitelists data/eqdp.duckdb (the rest of data/ is still developer-lo…aa3be69