滚动百分位数 - 熊猫
Posted
技术标签:
【中文标题】滚动百分位数 - 熊猫【英文标题】:Rolling Percentile - Pandas 【发布时间】:2022-01-16 13:49:37 【问题描述】:这给出了下面一列的百分比值,
df[column].rank(pct=True)
但是有没有办法通过使用这种类似的方法来获取列的滚动百分位值,而无需编写函数或循环和更长的代码?目前在添加.rolling(window)
时,它不起作用。
如果没有,Pandas 迫切需要将其添加为 .rolling()
的功能,.quantile()
有此功能,百分位数也没有它是没有意义的。
【问题讨论】:
Rolling rank 将是 added in 1.4.0。目前没有帮助,因为它尚未发布,但即将发布,可能可供本问答的未来访问者使用。 但是知道这对以后的使用来说真的很好,非常感谢。 【参考方案1】:在等待在 pandas 1.4.0 中添加滚动排名时,执行此操作的一种方法可能是:
import pandas as pd
df[column].rolling(window).apply(lambda x: len(x[x <= x.iloc[-1]]) / len(x))
window 是您试图滚动的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。由于我无法将代码以可读的代码格式放在评论部分,并且与我发布的原始问题略有不同,因此我为此发布了另一个问题。查看以下链接,***.com/q/70358306/5315363 好的,我去看看!以上是关于滚动百分位数 - 熊猫的主要内容,如果未能解决你的问题,请参考以下文章
python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)