import json, pandas as pd, numpy as np, gzip
from sklearn.metrics import roc_auc_score
pd.set_option('display.width',250)
F=pd.DataFrame(json.load(open('/tmp/run/feats4.json')))
P=pd.read_pickle('paths.pkl')
R=json.load(gzip.open('/tmp/run/rt.json.gz','rt'))
S={k.lower():v for k,v in R['supply'].items()}; K={k.lower():v for k,v in R['kline'].items()}
pk2={}
for a,k in K.items():
    s=S.get(a)
    if s: cl=sorted([x[4]*s for x in k if x[5]>=1000],reverse=True); pk2[a]=cl[1] if len(cl)>1 else (cl[0] if cl else 0)
r20=set(P[(P.src!='ctl_1to5M')&(P.pk7>=2e7)&(P.start_open<1e6)].tok)
big=set(P[(P.src!='ctl_1to5M')&(P.pk7>=2e7)].tok)
def grp(r):
    if r['kind']=='control2': return 'random_launch'
    if r['tok'] in r20: return 'R20_small'
    if r['tok'] in big: return 'R20_bigstart'
    p=pk2.get(r['tok'],0)
    if 1e6<=p<5e6: return 'RT_1to5M'
    if 5e6<=p<2e7: return 'RT_5to20M'
    return 'other'
F['grp']=F.apply(grp,axis=1)
print(F.grp.value_counts())
F['usdg']=F.quote.eq('0x5fc5360d0400a0fd4f2af552add042d716f1d168').astype(int)
F['weth']=F.quote.eq('0x0bd7d308f8e1639fab988df18a8011f41eacad73').astype(int)
F['eth']=F.quote.eq('0x'+'0'*40).astype(int)
F['nohook']=F.hook.fillna('0x'+'0'*40).eq('0x'+'0'*40).astype(int)
feats=['buyers_10s','buyers_60s','buyers_300s','buyers_1800s','blk0_buyers','blk0_share','share_bought_60s','share_bought_300s','sellers_30m','sell_share_30m','first_buy_delay_s','first_sell_s','top1_end','top10_end','holders_end','creator_bought','creator_prev_launches','n_pools','vets_60s','vets_5m','w2w_30m','early_quiet','usdg','weth','eth','nohook','hour']
A=F[F.grp=='R20_small']; B=F[F.grp=='RT_1to5M']; C=F[F.grp=='random_launch']; D=F[F.grp=='RT_5to20M']
rows=[]
for f in feats:
    def au(x,y):
        v=pd.concat([x[f],y[f]]).astype(float); lab=[1]*len(x)+[0]*len(y)
        m=~v.isna()
        try: return round(roc_auc_score(np.array(lab)[m.values],v[m]),2)
        except: return np.nan
    rows.append(dict(feature=f,R20_small=A[f].astype(float).median(),RT_5to20M=D[f].astype(float).median(),RT_1to5M=B[f].astype(float).median(),random=C[f].astype(float).median(),AUC_vs_1to5M=au(A,B),AUC_vs_random=au(A,C)))
T=pd.DataFrame(rows); print(T.round(3).to_string(index=False))
T.to_csv('f30.csv',index=False)
F.to_pickle('f30.pkl')
