import sys,os,json,pandas as pd;sys.path.insert(0,'scripts');from up import get,q def cand(path): c,j=get(path) if c!=200: print('ERR',c,str(j)[:160]); return None d=j['data']['candles']; df=pd.DataFrame(d,columns=['ts','open','high','low','close','volume','oi']); df['ts']=pd.to_datetime(df.ts.str[:19]); return df # retry empty expired contracts in 20-day chunks for name in ['NIFTY','BANKNIFTY']: for x in json.load(open(f'data/{name}_fut_contracts.json')): f=f"data/fut/{name}_{x['expiry']}.parquet" if os.path.exists(f) and len(pd.read_parquet(f))>0: continue e=pd.Timestamp(x['expiry']); parts=[] for s in range(100,0,-20): a=e-pd.Timedelta(days=s); b=min(e,a+pd.Timedelta(days=19)) df=cand(f"/v2/expired-instruments/historical-candle/{q(x['instrument_key'],safe='')}/1minute/{b:%Y-%m-%d}/{a:%Y-%m-%d}") if df is not None and len(df): parts.append(df) n=0 if parts: df=pd.concat(parts).drop_duplicates('ts').sort_values('ts'); df['expiry']=x['expiry']; df.to_parquet(f); n=len(df) print('retry',name,x['expiry'],x['instrument_key'].split('|')[1],n) keys=json.load(open('../data/keys.json')) for name,k,e in [('NIFTY',keys['NIFTYFUT'],'2026-10-27'),('NIFTY',keys['NIFTYFUT_NOV'],'2026-11-24'),('BANKNIFTY',keys['BANKNIFTYFUT'],'2026-10-27')]: parts=[] for a,b in [('2026-07-28','2026-08-25'),('2026-08-26','2026-09-24'),('2026-09-25','2026-10-23')]: df=cand(f"/v2/historical-candle/{q(k,safe='')}/1minute/{b}/{a}") if df is not None and len(df): parts.append(df) df=pd.concat(parts).drop_duplicates('ts').sort_values('ts'); df['expiry']=e; df.to_parquet(f'data/fut/{name}_{e}.parquet'); print(name,e,len(df),df.ts.min(),df.ts.max())