sds*_*sds 7 python numpy rank percentile pandas
我有“参考人口”(比如,v=np.random.rand(100)),我想计算给定集合(比如,np.array([0.3, 0.5, 0.7]))的百分位等级。
很容易一一计算:
def percentile_rank(x):
return (v<x).sum() / len(v)
percentile_rank(0.4)
=> 0.4
Run Code Online (Sandbox Code Playgroud)
(实际上,有一个开箱即用的scipy.stats.percentileofscore-但它并没有对矢量工作)。
np.vectorize(percentile_rank)(np.array([0.3, 0.5, 0.7]))
=> [ 0.33 0.48 0.71]
Run Code Online (Sandbox Code Playgroud)
这产生了预期的结果,但我觉得应该有一个内置的。
我也可以作弊:
pd.concat([pd.Series([0.3, 0.5, 0.7]),pd.Series(v)],ignore_index=True).rank(pct=True).loc[0:2]
0 0.330097
1 0.485437
2 0.718447
Run Code Online (Sandbox Code Playgroud)
这在两个方面很糟糕:
[0.3, 0.5, 0.7]成为排名的一部分。那么,实现这一目标的惯用方法是什么?
设置:
In [62]: v=np.random.rand(100)
In [63]: x=np.array([0.3, 0.4, 0.7])
Run Code Online (Sandbox Code Playgroud)
使用 Numpy 广播:
In [64]: (v<x[:,None]).mean(axis=1)
Out[64]: array([ 0.18, 0.28, 0.6 ])
Run Code Online (Sandbox Code Playgroud)
查看:
In [67]: percentile_rank(0.3)
Out[67]: 0.17999999999999999
In [68]: percentile_rank(0.4)
Out[68]: 0.28000000000000003
In [69]: percentile_rank(0.7)
Out[69]: 0.59999999999999998
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4064 次 |
| 最近记录: |