import sys,re,numpy as np,pandas as pd; sys.path.insert(0,'scripts'); from score import score R=pd.read_csv('results/yt_calls_scored.csv'); q=pd.read_csv('data/review_adjudicated.csv').set_index('cid') def setup(c): t=str(q.loc[c,'ctx'])+' '+str(q.loc[c,'note']) if re.search(r'स्कैल्प|scalp',t): return 'SCALP' if re.search(r'ब्रेक|ट्रेड लाइन|ब्रेकआउट|breakout|break|trendline|cross',t): return 'BREAK/TRENDLINE' if re.search(r'सपोर्ट|ब्लैक बॉक्स|लिक्विडिटी|रिजेक्ट|support|black box|rejection|डब्ल्यू',t): return 'SUPPORT/REJECTION' if re.search(r'री ?एंट्री|re-entry',t): return 'RE-ENTRY' return 'OTHER' R['setup']=R.cid.map(setup); sc=R[R.status=='scored'].copy() sc['real']=np.where(sc.exit_reason=='T','T',np.where(sc.exit_reason=='SL','SL','time')) cl=sc[sc.claim.isin(['T','SL'])]; agree=(cl.claim==cl.real).mean() print('claimed n',len(cl),'claimed T',(cl.claim=='T').sum(),'real T among claimed-T',((cl.claim=='T')&(cl.real=='T')).sum(),'agree',round(agree,3)) g=lambda s: pd.Series(dict(n=len(s),win=(s.net_pts>0).mean()*100,pts=s.net_pts.mean(),total=s.net_pts.sum())) by=pd.concat([sc.groupby('setup').apply(g).assign(cut='setup'),sc.groupby('idx').apply(g).assign(cut='index'),sc.groupby('claim').apply(g).assign(cut='stated outcome')]).round(2) print(by.to_string()); by.reset_index().rename(columns={'index':'group'}).to_csv('results/yt_by_group.csv',index=False) # sensitivity: TG forced to 2xSL (stated SL or fallback) s2=[] for r in sc.itertuples(): z=score(r.idx,r.date,r.strike,r.side,r.entry_ist[11:16],float(r.sl),2*float(r.sl)); s2.append(z['net_pts']) sc['net_1to2']=s2; print('1:2 sensitivity mean',np.mean(s2).round(2),'win',(np.array(s2)>0).mean().round(3)) sc['gross_pts']=sc.net_pts+sc.charges_pts; print('gross mean',sc.gross_pts.mean().round(2),'charges mean',sc.charges_pts.mean().round(2)) R=R.merge(sc[['cid','real','net_1to2','gross_pts']],on='cid',how='left'); R.to_csv('results/yt_calls_scored.csv',index=False) # counts print(R.status.value_counts().to_dict(),R.why.value_counts().to_dict())