feat: market event

This commit is contained in:
OpenSquared
2026-06-29 08:14:25 +02:00
parent 5e65424500
commit 97077af369
2 changed files with 184 additions and 88 deletions

View File

@@ -923,25 +923,37 @@ def analyze_event(body: AnalyzeRequest):
"graph_json": graph, # structure complète pour visualisation frontend
}
# Persistance
conn.execute("""
INSERT INTO causal_event_analyses
(market_event_id, template_id, instrument, inputs_json,
override_params, prediction_json, actual_json,
activation_score, drift_json, analyzed_at)
VALUES (?,?,?,?,?,?,?,?,?,?)
""", (
body.market_event_id,
body.template_id,
primary_inst,
json.dumps(inputs),
json.dumps(body.coef_overrides),
json.dumps(node_values),
json.dumps(actual_moves),
activation.get("score"),
json.dumps(drift_by_inst.get(primary_inst, {})),
analyzed_at,
))
# Persistance — UPSERT : one analysis per (market_event_id, template_id)
existing = conn.execute(
"SELECT id FROM causal_event_analyses WHERE market_event_id=? AND template_id=?",
(body.market_event_id, body.template_id),
).fetchone()
if existing:
conn.execute("""
UPDATE causal_event_analyses
SET instrument=?, inputs_json=?, override_params=?, prediction_json=?,
actual_json=?, activation_score=?, drift_json=?, analyzed_at=?
WHERE market_event_id=? AND template_id=?
""", (
primary_inst, json.dumps(inputs), json.dumps(body.coef_overrides),
json.dumps(node_values), json.dumps(actual_moves), activation.get("score"),
json.dumps(drift_by_inst.get(primary_inst, {})), analyzed_at,
body.market_event_id, body.template_id,
))
else:
conn.execute("""
INSERT INTO causal_event_analyses
(market_event_id, template_id, instrument, inputs_json,
override_params, prediction_json, actual_json,
activation_score, drift_json, analyzed_at)
VALUES (?,?,?,?,?,?,?,?,?,?)
""", (
body.market_event_id, body.template_id, primary_inst,
json.dumps(inputs), json.dumps(body.coef_overrides),
json.dumps(node_values), json.dumps(actual_moves),
activation.get("score"),
json.dumps(drift_by_inst.get(primary_inst, {})), analyzed_at,
))
conn.commit()
# Calibration
@@ -1206,6 +1218,25 @@ def list_analyses(
raise HTTPException(500, str(e))
@router.delete("/api/causal-lab/analyses/{analysis_id}")
def delete_analysis(analysis_id: int):
try:
from services.database import get_conn
conn = get_conn()
_init(conn)
row = conn.execute("SELECT id FROM causal_event_analyses WHERE id=?", (analysis_id,)).fetchone()
if not row:
conn.close(); raise HTTPException(404, "Analyse introuvable")
conn.execute("DELETE FROM causal_event_analyses WHERE id=?", (analysis_id,))
conn.commit(); conn.close()
return {"ok": True}
except HTTPException:
raise
except Exception as e:
logger.error(f"[causal_lab] delete_analysis: {e}")
raise HTTPException(500, str(e))
@router.get("/api/causal-lab/calibration")
def get_calibration():
"""Statistiques de calibration par template (avg_activation, avg_pred vs avg_actual)."""