def METHOD_NAME(self, start_frame, end_frame, channel_indices):
    if start_frame is None:
        start_frame = 0
    if end_frame is None:
        end_frame = self.get_num_samples()
    parent_traces = self.parent_recording_segment.METHOD_NAME(
        start_frame=start_frame,
        end_frame=end_frame,
        channel_indices=slice(None),
    )
    parent_traces = parent_traces.astype(self._dtype)
    # calculate derivative independently in each column
    derivative_traces = np.empty_like(parent_traces)
    for column_ix, other_pos in enumerate(self.unique_pos_other_dims):
        chans_in_column = np.flatnonzero(self.column_inds == column_ix)
        dim_pos_in_column = self.channel_locations[chans_in_column, self.dim]
        if dim_pos_in_column.size == 1:
            column_traces = np.zeros((parent_traces.shape[0], 1), dtype=self._dtype)
        else:
            column_traces = parent_traces[:, chans_in_column]
            for _ in range(self.order):
                column_traces = np.gradient(
                    column_traces,
                    dim_pos_in_column,
                    axis=1,
                    edge_order=self.edge_order,
                )
        # when order=0, do a spatial common reference
        if self.order == 0:
            column_traces -= column_traces.mean(axis=1, keepdims=True)
        derivative_traces[:, chans_in_column] = column_traces
    return derivative_traces