滚动百分位 - Pandas

3

以下是该列的百分位数值:

df[column].rank(pct=True)

但是有没有一种类似的方法,可以在不编写函数或循环以及更长的代码的情况下,获取列的滚动百分位值?当前,在添加 .rolling(window) 后,它无法正常工作。

如果没有,Pandas迫切需要将此功能添加为 .rolling() 的特性,它已经存在于 .quantile() 中,因此在百分位数方面缺少该特性是没有意义的。


2
滚动排名将在1.4.0版本中添加。目前还未发布,对于当前的访问者并不是很有帮助,但它即将推出,并可能为未来的访问者提供帮助。 - Henry Ecker
但那对于未来的使用真的很有用,非常感谢。 - Calculate
1个回答

1

在等待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

嗨,感谢您提供的替代方案。但是您使用了Lambda函数来实现它。我现在尝试使用常规函数和apply()方法来实现它。但是当我运行代码时,它会在列中输出0。由于我无法在评论部分以可读的代码格式放置代码,并且它与我最初发布的问题略有不同,因此我已经发布了另一个问题。请查看以下链接:https://dev59.com/nW0NtIcB2Jgan1znJGbW - Calculate
当然,我会看一下! - Fredaroo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接