# Real 1m option bars (Upstox-sourced parquet on box; no backfill, no credentials). Returns DataFrame indexed 'HH:MM' with open/high/low/close. import glob,functools,pickle,pandas as pd O='/workspace/nifty-options-s3/data/options' @functools.lru_cache(None) def _files(ix): fs=sorted(glob.glob(f'{O}/{"sensex/" if ix=="SENSEX" else ""}1m/by_expiry/*.parquet'))+sorted(glob.glob(f'{O}/{"sensex/" if ix=="SENSEX" else ""}1m/live/*.parquet')) return tuple(fs) import os def _cand(ix,date): out=[] for f in _files(ix): b=os.path.basename(f)[:10] try: e=pd.Timestamp(b) except Exception: continue if '/live/' in f or (e>=date and (e-date).days<=16): out.append(f) return out @functools.lru_cache(None) def _loadd(f,date): return pd.read_parquet(f,columns=['timestamp','date','expiry','option_type','strike','open','high','low','close'],filters=[('date','==',date)]) @functools.lru_cache(None) def _panels(): return pickle.load(open('/workspace/research/flow-forensics-2026-10/recov/data/opt_panels.pkl','rb')) def expiries(ix,date): date=pd.Timestamp(date); ex=set() for f in _cand(ix,date): d=_loadd(f,date); ex|=set(d.loc[d.date==date,'expiry'].unique()) if ix=='NIFTY': ex|={k[1] for k in _panels() if k[0]==date} return sorted(e for e in ex if e>=date) def bars(ix,date,strike,typ,expiry=None): date=pd.Timestamp(date); ex=expiry or (expiries(ix,date) or [None])[0] if ex is None: return None,None,'no_data_for_date' for f in _cand(ix,date): d=_loadd(f,date); g=d[(d.date==date)&(d.expiry==ex)&(d.option_type==typ)&(d.strike==float(strike))] if len(g)>30: g=g.drop_duplicates('timestamp').sort_values('timestamp'); g.index=g.timestamp.dt.strftime('%H:%M'); return g[['open','high','low','close']],ex,'parquet' if ix=='NIFTY': p=_panels().get((date,ex)) if p is not None and ('close',typ,float(strike)) in p.columns: g=pd.DataFrame({c:p[(c,typ,float(strike))] for c in ['open','high','low','close']}).dropna() if len(g)>30: return g,ex,'opt_panels' return None,ex,'strike_missing'