docs: 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