code: def next_event_indexer(
      all_dates,
      data_query_cutoff,
      all_sids,
      event_dates,
      event_timestamps,
      event_sids,
  ):
      """
      Construct an index array that, when applied to an array of values, produces
      a 2D array containing the values associated with the next event for each
      sid at each moment in time.
  
      Locations where no next event was known will be filled with -1.
  
      Parameters
      ----------
      all_dates : ndarray[datetime64[ns], ndim=1]
          Row labels for the target output.
      data_query_cutoff : pd.DatetimeIndex
          The boundaries for the given trading sessions in ``all_dates``.
      all_sids : ndarray[int, ndim=1]
          Column labels for the target output.
      event_dates : ndarray[datetime64[ns], ndim=1]
          Dates on which each input events occurred/will occur.  ``event_dates``
          must be in sorted order, and may not contain any NaT values.
      event_timestamps : ndarray[datetime64[ns], ndim=1]
          Dates on which we learned about each input event.
      event_sids : ndarray[int, ndim=1]
          Sids assocated with each input event.
  
      Returns
      -------
      indexer : ndarray[int, ndim=2]
          An array of shape (len(all_dates), len(all_sids)) of indices into
          ``event_{dates,timestamps,sids}``.
      """
      validate_event_metadata(event_dates, event_timestamps, event_sids)
      out = np.full((len(all_dates), len(all_sids)), -1, dtype=np.int64)
  
      sid_ixs = all_sids.searchsorted(event_sids)
      # side='right' here ensures that we include the event date itself
      # if it's in all_dates.
      dt_ixs = all_dates.searchsorted(event_dates, side="right")
      ts_ixs = data_query_cutoff.searchsorted(
          event_timestamps, side="right"
      )
  
      # Walk backward through the events, writing the index of the event into
      # slots ranging from the event's timestamp to its asof.  This depends for
      # correctness on the fact that event_dates is sorted in ascending order,
      # because we need to overwrite later events with earlier ones if their
      # eligible windows overlap.
      for i in range(len(event_sids) - 1, -1, -1):
          start_ix = ts_ixs[i]
          end_ix = dt_ixs[i]
          out[start_ix:end_ix, sid_ixs[i]] = i
  
      return out
  
file_path: zipline/zipline/pipeline/loaders/utils.py
imports: import numpy
  import pandas
  from zipline.errors import NoFurtherDataError
  from zipline.pipeline.common import TS_FIELD_NAME, SID_FIELD_NAME
  from zipline.utils.numpy_utils import categorical_dtype
label_desc: Use image node_id 3 for calling a global function with example usage: next_event_indexer(all_dates, data_query_cutoff, all_sids, event_dates, event_timestamps, event_sids) and returns: out