code: def rolling_windows(a, window):
      
  
      if window > a.shape[0]:
          raise ValueError(
              "Specified `window` length of {0} exceeds length of"
              " `a`, {1}.".format(window, a.shape[0])
          )
      if isinstance(a, (Series, DataFrame)):
          a = a.values
      if a.ndim == 1:
          a = a.reshape(-1, 1)
      shape = (a.shape[0] - window + 1, window) + a.shape[1:]
      strides = (a.strides[0],) + a.strides
      windows = np.squeeze(
          np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
      )
      # In cases where window == len(a), we actually want to "unsqueeze" to 2d.
      #     I.e., we still want a "windowed" structure with 1 window.
      if windows.ndim == 1:
          windows = np.atleast_2d(windows)
      return windows
docs: Creates rolling-window 'blocks' of length `window` from `a`.
  
      Note that the orientation of rows/columns follows that of pandas.
  
      Example
      -------
      import numpy as np
      onedim = np.arange(20)
      twodim = onedim.reshape((5,4))
  
      print(twodim)
      [[ 0  1  2  3]
       [ 4  5  6  7]
       [ 8  9 10 11]
       [12 13 14 15]
       [16 17 18 19]]
  
      print(rwindows(onedim, 3)[:5])
      [[0 1 2]
       [1 2 3]
       [2 3 4]
       [3 4 5]
       [4 5 6]]
  
      print(rwindows(twodim, 3)[:5])
      [[[ 0  1  2  3]
        [ 4  5  6  7]
        [ 8  9 10 11]]
  
       [[ 4  5  6  7]
        [ 8  9 10 11]
        [12 13 14 15]]
  
       [[ 8  9 10 11]
        [12 13 14 15]
        [16 17 18 19]]]