我有一个“参考人群”(比如说,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
实际上,有一个开箱即用的scipy.stats.percentileofscore
函数 - 但它不能用于向量。
np.vectorize(percentile_rank)(np.array([0.3, 0.5, 0.7]))
=> [ 0.33 0.48 0.71]
这样做可以得到预期的结果,但我感觉应该有一个内置的方法来实现这个功能。
我也可以作弊:
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
这种方法有两个问题:
- 我不希望测试数据
[0.3, 0.5, 0.7]
成为排名的一部分。 - 我不想浪费时间计算参考人群的排名。
那么,有什么符合惯用法的方法来解决这个问题呢?
v
和x
都是数据框中的Series
列时,我会得到ValueError: Lengths must match to compare
错误。 - sds(v.values<x.values[:,None]).mean(axis=1)
。 - MaxU - stand with Ukraine