code: def rowsBetween(self, start, end):
          
          if start <= Window._PRECEDING_THRESHOLD:
              start = Window.unboundedPreceding
          if end >= Window._FOLLOWING_THRESHOLD:
              end = Window.unboundedFollowing
          return WindowSpec(self._jspec.rowsBetween(start, end))
docs: Defines the frame boundaries, from `start` (inclusive) to `end` (inclusive).
  
          Both `start` and `end` are relative positions from the current row.
          For example, "0" means "current row", while "-1" means the row before
          the current row, and "5" means the fifth row after the current row.
  
          We recommend users use ``Window.unboundedPreceding``, ``Window.unboundedFollowing``,
          and ``Window.currentRow`` to specify special boundary values, rather than using integral
          values directly.
  
          :param start: boundary start, inclusive.
                        The frame is unbounded if this is ``Window.unboundedPreceding``, or
                        any value less than or equal to max(-sys.maxsize, -9223372036854775808).
          :param end: boundary end, inclusive.
                      The frame is unbounded if this is ``Window.unboundedFollowing``, or
                      any value greater than or equal to min(sys.maxsize, 9223372036854775807).