import pandas as pd,numpy as np,glob,os pd.set_option('display.width',250);pd.set_option('display.max_columns',30) W=pd.read_csv('../data/implied_weights.csv',index_col=0) D='../data/1m' out=open('results/components_report.txt','w') def pr(*a): s=' '.join(str(x) for x in a); print(s); out.write(s+'\n') def L(n): d=pd.read_csv(f'{D}/{n}_1m.csv',parse_dates=['ts']); d['ts']=d.ts.dt.tz_localize(None); return d.set_index('ts') for day,a,b,base in [('2026-10-23','13:36','13:47','13:36'),('2026-10-13','09:15','10:00',None),('2026-10-13','14:28','14:50','14:28')]: pr(f'\n===== {day} {a}-{b}') days=sorted(pd.read_csv(f'{D}/NIFTY_1m.csv').ts.str[:10].unique()); i=days.index(day); prev20=days[max(0,i-20):i] rows=[];mins={} for s in W.index: if not os.path.exists(f'{D}/{s}_1m.csv'): continue m=L(s); dd=m.loc[day] if base is None: # from previous close p0=m.loc[days[i-1]].close.between_time('09:15','15:14').iloc[-1] if False else None dm=pd.read_csv(f'{D}/{s}_day.csv'); dm['d']=dm.ts.str[:10]; p0=dm.set_index('d').close[days[i-1]] else: p0=dd.close[pd.Timestamp(f'{day} {base}')] seg=dd.between_time(a,b) c=(seg.close-p0)*W.pts_per_rupee[s] # 20d same-minute volume hist=m[m.index.strftime('%Y-%m-%d').isin(prev20)]; hv=hist.groupby(hist.index.strftime('%H:%M')).volume.mean() vr=(seg.volume.sum())/hv.reindex(seg.index.strftime('%H:%M')).sum() thr=0.0015*p0; first=seg.index[(seg.close-p0)>=thr] rows.append(dict(sym=s,weight_pct=round(W.implied_weight_pct[s],2),pts_contrib=round(c.iloc[-1],1),pct=round(100*(seg.close.iloc[-1]/p0-1),2),vol_x20d=round(vr,1),first_up015=first[0].strftime('%H:%M') if len(first) else '-')) mins[s]=c.diff().fillna(c) R=pd.DataFrame(rows).sort_values('pts_contrib',ascending=False); R.to_csv(f'results/components_{day}_{a.replace(":","")}.csv',index=False) pr(R.head(12).to_string(index=False)); pr('sum all 50:',round(R.pts_contrib.sum(),1)) M=pd.DataFrame(mins); top=R.sym.head(8).tolist() if base: pr('per-minute pts contribution (top8)'); pr(M[top].round(1).loc[:pd.Timestamp(f'{day} 13:44') if day=='2026-10-23' else None].head(14).to_string()) # sector split banks=['HDFCBANK','ICICIBANK','AXISBANK','KOTAKBANK','SBIN']; it=['INFY','TCS','HCLTECH','TECHM','WIPRO'] pr('banks pts',round(R[R.sym.isin(banks)].pts_contrib.sum(),1),'IT pts',round(R[R.sym.isin(it)].pts_contrib.sum(),1),'RIL',R.set_index('sym').pts_contrib.get('RELIANCE')) out.close()