Files
resonance-engine/analyze_april_full.py
T
2026-06-07 19:34:30 +07:00

92 lines
4.2 KiB
Python

import pandas as pd, numpy as np
from pathlib import Path
from scipy.stats import spearmanr
D = Path("/mnt/d/Resonance_Engine/traj/tension_20260607T130445")
A = pd.read_parquet(D/"arm_A_no_inject.parquet")
T = pd.read_parquet(D/"arm_T_tension.parquet")
CHANNELS = ["asymmetry","coherence","stress_xx","stress_yy","stress_xy","vorticity_mean","vel_mean","vel_max","vel_var"]
TENSIONS = ["funding_bps","bs_ratio_signed","activity_excess","cvd_divergence"]
print("="*96)
print(f"FULL APRIL RUN {D.name}")
print("="*96)
for label,df in [("A",A),("T",T)]:
age = df["snap_age_ms"].dropna()
print(f" arm {label}: rows={len(df):,} snap_age_ms p50={age.quantile(.5):.0f} p95={age.quantile(.95):.0f} p99={age.quantile(.99):.0f}")
# tension distributions on the full month
print()
print("=== tension distributions (full April) ===")
for tn in TENSIONS:
v = pd.to_numeric(T[tn], errors="coerce").dropna()
print(f" {tn:<22} n={len(v):,} mean={v.mean():+.3g} std={v.std():.3g} p5={v.quantile(.05):+.3g} p95={v.quantile(.95):+.3g} min={v.min():+.3g} max={v.max():+.3g}")
print()
print(f"{'channel':<16} " + " ".join(f"{tn:>22}" for tn in TENSIONS))
maxrho = {tn: (0.0, "") for tn in TENSIONS}
for ch in CHANNELS:
row = f"{ch:<16} "
for tn in TENSIONS:
sub = T[[ch, tn]].apply(pd.to_numeric, errors="coerce").dropna()
if len(sub) < 30:
row += f"{'n/a':>22} "
else:
rho, p = spearmanr(sub[tn], sub[ch])
flag = "*" if p<1e-10 else ("." if p<0.05 else " ")
row += f" rho={rho:+.3f} p={p:.1g}{flag} "
if abs(rho) > abs(maxrho[tn][0]):
maxrho[tn] = (rho, ch)
print(row)
print()
print("=== PRIMARY CHANNEL VERDICT ===")
for tn in TENSIONS:
rho, ch = maxrho[tn]
if abs(rho) > 0.50: target = "TOO HOT"
elif abs(rho) < 0.15: target = "TOO QUIET"
elif abs(rho) < 0.20: target = "marginal"
else: target = "IN BAND"
print(f" {tn:<22} -> {ch:<16} |rho|={abs(rho):.3f} [{target}]")
# how often does each tension actually fire vs sit near 0
print()
print("=== injection density (fraction of minutes where |encoded_strength| > 0.1) ===")
import math
def cap(x, c): return max(-c, min(c, x))
T["fund_str"] = T.funding_bps.apply(lambda x: cap(x/3000.0, 2.5))
T["bs_str"] = T.bs_ratio_signed.apply(lambda x: cap(x/0.5, 3.0))
T["act_str"] = T.activity_excess.apply(lambda x: cap(x/3.0, 5.0))
T["cvd_str"] = T.cvd_divergence.apply(lambda x: math.tanh(x/2e6) if pd.notna(x) else 0.0)
for col,name in [("fund_str","funding"),("bs_str","bs_ratio"),("act_str","activity"),("cvd_str","cvd")]:
v = T[col].dropna()
print(f" {name:<10} |s|>0.1: {(v.abs()>0.1).mean()*100:5.1f}% |s|>0.5: {(v.abs()>0.5).mean()*100:5.1f}% p50|s|={v.abs().quantile(.5):.3f} p95|s|={v.abs().quantile(.95):.3f} max|s|={v.abs().max():.3f}")
# arm A vs arm T contrast (the actual treatment effect)
print()
print("=== arm-T vs arm-A channel deltas ===")
print(f"{'channel':<16} {'A mean':>14} {'T mean':>14} {'A std':>14} {'T std':>14} {'delta_mean/A_std':>20}")
for ch in CHANNELS:
a = pd.to_numeric(A[ch], errors="coerce").dropna()
t = pd.to_numeric(T[ch], errors="coerce").dropna()
if len(a) < 30 or len(t) < 30: continue
dmean = t.mean() - a.mean()
norm = dmean / (a.std() + 1e-12)
print(f" {ch:<14} {a.mean():>14.4g} {t.mean():>14.4g} {a.std():>14.4g} {t.std():>14.4g} {norm:>20.3f}")
print()
print("=== compare to shakedown 4 (300 min) ===")
T_short = pd.read_parquet("/mnt/d/Resonance_Engine/traj/tension_20260607T125954/arm_T_tension.parquet")
print(f"{'tension':<22} {'shake4 |rho|':>14} {'month |rho|':>14} {'delta':>10}")
for tn in TENSIONS:
short_best=0.0; long_best=0.0
for ch in CHANNELS:
sub_s = T_short[[ch,tn]].apply(pd.to_numeric, errors="coerce").dropna()
if len(sub_s)>=30:
r,_=spearmanr(sub_s[tn], sub_s[ch]); short_best = r if abs(r)>abs(short_best) else short_best
sub_l = T[[ch,tn]].apply(pd.to_numeric, errors="coerce").dropna()
if len(sub_l)>=30:
r,_=spearmanr(sub_l[tn], sub_l[ch]); long_best = r if abs(r)>abs(long_best) else long_best
print(f" {tn:<22} {abs(short_best):>14.3f} {abs(long_best):>14.3f} {abs(long_best)-abs(short_best):>+10.3f}")