import pandas as pd, numpy as np
O='/opt/rot/analyst/out/'
L=pd.read_csv(O+'legs.csv',parse_dates=['start','peak']); S=pd.read_csv(O+'signals.csv',parse_dates=['start'])
LAUNCH={'C:base':'2023-08-09','MEME:base':'2023-08-09','C:arb':'2021-08-31','C:sui':'2023-05-03','C:hyper':'2024-11-29','C:avax':'2020-09-21','C:bnb':'2020-09-01','MEME:bnb':'2020-09-01','C:sol':'2020-03-16','MEME:sol':'2020-03-16'}
ok=L.apply(lambda r: r.group not in LAUNCH or r.start>=pd.Timestamp(LAUNCH[r.group]),axis=1)
L=L[ok&(L.group!='S:other')&(L.n>=5)]
print('valid legs',len(L))
for ph,g in L.groupby('phase'):
    print('\n##',ph,'legs',len(g),'median days',g.days.median(),'median RS gain',round(g.rs_gain.median(),2))
    # first leg start per group (order of rotation) and best leg per group
    b=g.sort_values('rs_gain',ascending=False).groupby('group').head(1).sort_values('start')
    print(b[['group','start','peak','days','rs_gain','usd_gain','n']].to_string(index=False))
S=S.merge(L[['group','start']],on=['group','start'])
agg=S[S.lead_days.notna()].groupby(['signal']).agg(n=('lead_days','size'),lead_med=('lead_days','median'),left_med=('leg_left','median'))
agg['of']=S.groupby('signal').size(); print('\nSIGNALS valid legs\n',agg.to_string())
for ph in ['2020-21','2023-26']:
    s=S[S.phase==ph]; a=s[s.lead_days.notna()].groupby('signal').agg(n=('lead_days','size'),lead_med=('lead_days','median'),left_med=('leg_left','median')); print(ph,'\n',a.to_string())
