feat: market event
This commit is contained in:
@@ -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)."""
|
||||
|
||||
Reference in New Issue
Block a user