docs: def coarsen(self, windows, func, boundary='exact', side='left'):
          """
          Apply
          """
          windows = {k: v for k, v in windows.items() if k in self.dims}
          if not windows:
              return self.copy()
  
          reshaped, axes = self._coarsen_reshape(windows, boundary, side)
          if isinstance(func, str):
              name = func
              func = getattr(duck_array_ops, name, None)
              if func is None:
                  raise NameError('{} is not a valid method.'.format(name))
          return type(self)(self.dims, func(reshaped, axis=axes), self._attrs)