As suggested in a duplicate, collections.deque.rotate (builtin library) or numpy.roll (more efficient 3rd-party library) is almost-certainly what you're looking for!
>>> from collections import deque as Deque
>>> d = Deque([1, -1, 2, 0])
>>> d
deque([1, -1, 2, 0])
>>> d.rotate(1)
>>> d
deque([0, 1, -1, 2])
>>> import numpy as np
>>> arr = np.array([1, -1, 2, 0])
>>> np.roll(arr, 1)
array([ 0, 1, -1, 2])
>>> np.roll(arr, 2)
array([ 2, 0, 1, -1])
NOTE that the deque mutates the original collection, while numpy.roll returns a rotated copy
You can create a single DataFrame by assembling each possible roll for the length of the array, though you may find it's more efficient to calculate the rolls when you need them
>>> arr = np.array([1, 2])
>>> pd.DataFrame([np.roll(arr, roll_index) for roll_index in range(len(arr))])
0 1
0 1 2
1 2 1
>>> arr = np.array([1, -1, 2, 0, 9])
>>> pd.DataFrame([np.roll(arr, roll_index) for roll_index in range(len(arr))])
0 1 2 3 4
0 1 -1 2 0 9
1 9 1 -1 2 0
2 0 9 1 -1 2
3 2 0 9 1 -1
4 -1 2 0 9 1