import pandas as pd, numpy as np, json, gzip, glob
G=json.load(open('gt7.json'))
d=pd.read_pickle('clean.pkl')
need=set(G)
sup={}
for f in glob.glob('rows_*.jsonl.gz'):
    for l in gzip.open(f,'rt'):
        t=l[9:51]
        if t in need:
            o=json.loads(l); sup[o['tok']]=o['sup']
x=d[d.tok.isin(G)].copy()
def pk7(r):
    g=G[r.tok]; o=g.get('ohlcv')
    if not o: return np.nan
    cl=sorted([c[4] for c in o if r.t0-3600<=c[0]<=r.t0+7*86400 and c[5]>0],reverse=True)
    if not cl: return np.nan
    return (cl[1] if len(cl)>1 else cl[0])*sup.get(r.tok,np.nan)
x['pk7']=x.apply(pk7,axis=1)
x['pk7']=np.fmax(x.pk7,x.pk)   # never below the 6h sellable peak
print('have 7d',x.pk7.notna().sum(),'of',len(x))
CH=[60,120,300,600,900,1800,3600,7200,10800]
def straight(r):
    tc=r['ts_500000']; worst=1
    for T in CH:
        if T>=tc: break
        m=r['mc_%d'%T]; mx=r['mcmax_%d'%T]
        if pd.notna(m) and pd.notna(mx) and mx>0: worst=min(worst,m/mx)
    return worst
x['straight']=x.apply(straight,axis=1)>=0.5
x.to_pickle('x7.pkl')
for fam in ['organic','bundle_eth']:
    s=x[(x.fam==fam)&x.pk7.notna()]
    s=s.assign(spd=pd.cut(s['ts_500000'],[-1,300,900,3600,21600],labels=['<5m','5-15m','15-60m','1-6h']))
    g=s.groupby('spd',observed=True).agg(n=('tok','size'),p2=('pk7',lambda v:(v>=2e6).mean()*100),p5=('pk7',lambda v:(v>=5e6).mean()*100),p20=('pk7',lambda v:(v>=2e7).mean()*100),n20=('pk7',lambda v:(v>=2e7).sum()))
    print('\n',fam,'crossed sellable $500k, 7-day outcome by speed'); print(g.round(1).to_string())
    g=s.groupby('straight').agg(n=('tok','size'),p5=('pk7',lambda v:(v>=5e6).mean()*100),p20=('pk7',lambda v:(v>=2e7).mean()*100))
    print(' straight-up path'); print(g.round(1).to_string())
print(x[x.pk7>=5e6][['sym','day','fam','ts_500000','pk','pk7','straight','vets60']].sort_values('pk7',ascending=False).to_string())
