<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _process_works(self, maybe_works, no_works, output_dir):
 """Collect and return the data of how each work in `maybe_works` relates to each other work. :param maybe_works: :type maybe_works: `list` of `str` :param no_works: :type no_works: `list` of `str` :param output_dir: base output directory :type output_dir: `str` :rtype: `pandas.DataFrame` """

        output_data_dir = os.path.join(output_dir, 'data')
        no_catalogue = {work: self._no_label for work in no_works}
        self._ym_intersects_dir = os.path.join(output_data_dir,
                                               'ym_intersects')
        data = {}
        os.makedirs(self._ym_intersects_dir, exist_ok=True)
        for yes_work in maybe_works:
            no_catalogue[yes_work] = self._maybe_label
            stats = self._process_yes_work(yes_work, no_catalogue,
                                           maybe_works, output_data_dir)
            no_catalogue.pop(yes_work)
            for scope in (SHARED, COMMON, UNIQUE):
                work_data = stats[scope]
                index = pd.MultiIndex.from_tuples(
                    list(work_data.keys()), names=[RELATED_WORK, SIGLUM])
                data[(yes_work, scope)] = pd.Series(list(work_data.values()),
                                                    index=index)
        df = pd.DataFrame(data)
        df.columns.names = [BASE_WORK, SCOPE]
        df = df.stack(BASE_WORK).swaplevel(
            BASE_WORK, SIGLUM).swaplevel(RELATED_WORK, BASE_WORK)
        return df