docs: def rank(self, dim, pct=False, keep_attrs=None):
          """Ranks the data.
  
          Equal values are assigned a rank that is the average of the ranks that
          would have been otherwise assigned to all of the values within that
          set.  Ranks begin at 1, not 0. If pct, computes percentage ranks.
  
          NaNs in the input array are returned as NaNs.
  
          The `bottleneck` library is required.
  
          Parameters
          ----------
          dim : str
              Dimension over which to compute rank.
          pct : bool, optional
              If True, compute percentage ranks, otherwise compute integer ranks.
          keep_attrs : bool, optional
              If True, the dataset's attributes (`attrs`) will be copied from
              the original object to the new one.  If False (default), the new
              object will be returned without attributes.
  
          Returns
          -------
          ranked : DataArray
              DataArray with the same coordinates and dtype 'float64'.
  
          Examples
          --------
  
          >>> arr = xr.DataArray([5, 6, 7], dims='x')
          >>> arr.rank('x')
          <xarray.DataArray (x: 3)>
          array([ 1.,   2.,   3.])
          Dimensions without coordinates: x
          """
  
          ds = self._to_temp_dataset().rank(dim, pct=pct, keep_attrs=keep_attrs)
          return self._from_temp_dataset(ds)