首页 > 解决方案 > 在扩展数据帧上获得固定百分位数的更快方法

问题描述

目前我正在做以下事情,因为我需要跟踪扩展值集的特定百分位数。

我想知道是否有更优化的方法可以使用任何 numpy 矢量化技巧来做到这一点


import numpy as np

import pandas as pd

a=np.random.rand(1000)

df=pd.DataFrame(a,columns=['Data'])

val=25

df['25th_Perc']=df.expanding(min_periods=1).apply(lambda x:np.nanpercentile(x,val,interpolation='nearest'),raw=True)

标签: pythonpandasnumpy

解决方案


这不一定是 NumPy 技巧,而更像是 Pandas 技巧。

除了使用 apply 函数来应用 NumPy 的 percentile 函数,您还可以使用Pandas 的内置 percentile 函数。

df.Data.expanding(2).quantile(0.25, interpolation="nearest")

这可以节省您的代码提取 np 数组和使用apply函数迭代的工作,而是直接应用您的转换。我怀疑在幕后,它的工作原理与您的示例相同,但没有我们直接调用它的开销。

这段代码可读性更强,速度也更快。在使用您的示例代码进行测试后,我看到了约 98% 的加速,但 YMMV。


推荐阅读