I am using Pandas 1.51 and I’m trying to get the rank of each row in a dataframe in a rolling window that looks ahead by employing FixedForwardWindowIndexer. But I can’t make sense of the results. My code:
df = pd.DataFrame({"X":[9,3,4,5,1,2,8,7,6,10,11]})
window_size = 5
indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=window_size)
df.rolling(window=indexer).rank(ascending=False)
results:
X 0 5.0 1 4.0 2 1.0 3 2.0 4 3.0 5 1.0 6 1.0 7 NaN 8 NaN 9 NaN 10 NaN
By my reckoning, it should look like:
X 0 1.0 # based on the window [9,3,4,5,1], 9 is ranked 1st w/ascending = False 1 3.0 # based on the window [3,4,5,1,2], 3 is ranked 3rd 2 3.0 # based on the window [4,5,1,2,8], 4 is ranked 3rd 3 3.0 # etc 4 5.0 5 5.0 6 3.0 7 NaN 8 NaN 9 NaN 10 NaN
I am basing this on a backward-looking window, which works fine:
>>> df.rolling(window_size).rank(ascending=False)
      X
0   NaN
1   NaN
2   NaN
3   NaN
4   5.0
5   4.0
6   1.0
7   2.0
8   3.0
9   1.0
10  1.0
Any assistance is most welcome.
Advertisement
Answer
Here is another way to do it:
df["rank"] = [
    x.rank(ascending=False).iloc[0].values[0]
    for x in df.rolling(window_size)
    if len(x) == window_size
] + [pd.NA] * (window_size - 1)
Then:
print(df)
# Output
     X  rank
0    9   1.0
1    3   3.0
2    4   3.0
3    5   3.0
4    1   5.0
5    2   5.0
6    8   3.0
7    7  <NA>
8    6  <NA>
9   10  <NA>
10  11  <NA>