def _compute(self, windows, dates, assets, mask):
        compute = self.compute
        missing_value = self.missing_value
        params = self.params
        outputs = self.outputs
        if outputs is not NotSpecified:
            out = recarray(
                mask.shape,
                formats=[self.dtype.str] * len(outputs),
                names=outputs,
            )
            out[:] = missing_value
        else:
            out = full_like(mask, missing_value, dtype=self.dtype)
        with self.ctx:
            # TODO: Consider pre-filtering columns that are all-nan at each
            # time-step?
            for idx, date in enumerate(dates):
                col_mask = mask[idx]
                masked_out = out[idx][col_mask]
                masked_assets = assets[col_mask]

                compute(
                    date,
                    masked_assets,
                    masked_out,
                    *(next(w)[:, col_mask] for w in windows),
                    **params
                )
                out[idx][col_mask] = masked_out
        return out
Call the user's `compute` function on each window with a pre-built
dataset/ETHPy150Open quantopian/zipline/zipline/pipeline/mixins.py/CustomTermMixin._compute