[docs]@njit(nogil=True,parallel=True)deftime_cues(timestamps:NDArray[np.int64]):""" :param timestamps : int64 nanoseconds UTC :returns: tuple of arrays for the block-7 features (sin_td, cos_td, dow,, asia, eu, us, sess_x, top_hr) """n=timestamps.size# pre-allocatesin_td=np.empty(n,np.float64)cos_td=np.empty(n,np.float64)sin_dw=np.empty(n,np.float64)# day of weekcos_dw=np.empty(n,np.float64)asia=np.zeros(n,np.bool_)eu=np.zeros(n,np.bool_)us=np.zeros(n,np.bool_)trans=np.zeros(n,np.bool_)# optionaltop_hr=np.zeros(n,np.bool_)# optionalsecs_day=86400.0twopi=2.0*np.piforiinprange(n):ts=timestamps[i]//1_000_000_000# seconds# ---------- time-of-day cyclical ----------sec_in_day=ts%86400phase=twopi*(sec_in_day/secs_day)sin_td[i]=np.sin(phase)cos_td[i]=np.cos(phase)# ---------- day-of-week cyclical ----------# Unix epoch (Jan 1, 1970) was a Thursday# To get day of week where Monday=0, we offset by 3day_week=(ts//86400+3)%7# Unix epoch was Thu(=4)phase_w=twopi*(day_week/7.0)sin_dw[i]=np.sin(phase_w)cos_dw[i]=np.cos(phase_w)# ---------- session flags ---------------hour=(sec_in_day//3600)if0<=hour<8:asia[i]=1if7<=hour<15:eu[i]=1if13<=hour<21:us[i]=1# ---------- transition (optional) -------minute=(sec_in_day%3600)//60if(hourin(0,7,13))andminute==0:trans[i]=1# ---------- on-the-hour -----------------ifminute==0:top_hr[i]=1returnsin_td,cos_td,sin_dw,cos_dw,asia,eu,us,trans,top_hr