以下是该列的百分位数值:
df[column].rank(pct=True)
但是有没有一种类似的方法,可以在不编写函数或循环以及更长的代码的情况下,获取列的滚动百分位值?当前,在添加 .rolling(window)
后,它无法正常工作。
如果没有,Pandas迫切需要将此功能添加为 .rolling()
的特性,它已经存在于 .quantile()
中,因此在百分位数方面缺少该特性是没有意义的。
以下是该列的百分位数值:
df[column].rank(pct=True)
但是有没有一种类似的方法,可以在不编写函数或循环以及更长的代码的情况下,获取列的滚动百分位值?当前,在添加 .rolling(window)
后,它无法正常工作。
如果没有,Pandas迫切需要将此功能添加为 .rolling()
的特性,它已经存在于 .quantile()
中,因此在百分位数方面缺少该特性是没有意义的。
在等待pandas 1.4.0添加Rolling rank的同时,可以通过以下方式进行:
import pandas as pd
df[column].rolling(window).apply(lambda x: len(x[x <= x.iloc[-1]]) / len(x))
其中 window 是您要滚动的窗口。这应该会给您与在等于当前窗口的数据帧上使用 df[column].rank(pct=True)
相同的结果。
lambda 函数通过将小于或等于最后一个值的出现次数除以总值来给出百分比,从而为我们提供了低于当前行的分数的百分比。
注意:窗口大小下的值将返回 NaN
。例如,对于 window=2
的第一个值。
示例:
n = [5, 10, 9, 7, 6, 9, 4]
df = pd.DataFrame(n, columns=['Scores'])
df['rank_result'] = df['Scores'].rank(pct=True)
df['rolling_apply'] = df['Scores'].rolling(7).apply(lambda x: len(x[x <= x.iloc[-1]]) / len(x))
print(df[6:7]) # get the last row to compare
Scores rank_result rolling_apply
6 4 0.142857 0.142857