code: def rollapply(data, window, fn):
      
      res = data.copy()
      res[:] = np.nan
      n = len(data)
  
      if window > n:
          return res
  
      for i in range(window - 1, n):
          res.iloc[i] = fn(data.iloc[i - window + 1:i + 1])
  
      return res
docs: Apply a function fn over a rolling window of size window.
  
      Args:
          * data (Series or DataFrame): Series or DataFrame
          * window (int): Window size
          * fn (function): Function to apply over the rolling window.
              For a series, the return value is expected to be a single
              number. For a DataFrame, it shuold return a new row.
  
      Returns:
          * Object of same dimensions as data