Python 如果概率密度函数数据为x和y,则计算百分位数

Python 如果概率密度函数数据为x和y,则计算百分位数,python,probability,distribution,kde,percentile,Python,Probability,Distribution,Kde,Percentile,我从pdf图表中提取数据,其中x代表孵化时间,y代表csv文件中的密度。我想计算百分位数,比如95%。我有点困惑,我是否应该只使用x值计算百分位,即使用np.prentile(x,0.95) 绘图中的数据: 下面是一些使用np.trapz(由@pjs提出)的代码。我们取x和y数组,假设它是PDF,所以首先我们将它规格化为1,然后开始向后搜索,直到达到0.95点。 我制作了一些多峰函数 import numpy as np import matplotlib.pyplot as plt N =

我从pdf图表中提取数据,其中x代表孵化时间,y代表csv文件中的密度。我想计算百分位数,比如95%。我有点困惑,我是否应该只使用x值计算百分位,即使用
np.prentile(x,0.95)

绘图中的数据:
下面是一些使用np.trapz(由@pjs提出)的代码。我们取x和y数组,假设它是PDF,所以首先我们将它规格化为1,然后开始向后搜索,直到达到0.95点。 我制作了一些多峰函数

import numpy as np
import matplotlib.pyplot as plt

N = 1000

x = np.linspace(0.0, 6.0*np.pi, N)
y = np.sin(x/2.0)/x # construct some multi-peak function
y[0] = y[1]
y = np.abs(y)

plt.plot(x, y, 'r.')
plt.show()

# normalization
norm = np.trapz(y, x)
print(norm)

y = y/norm
print(np.trapz(y, x)) # after normalization

# now compute integral cutting right limit down by one
# with each iteration, stop as soon as we hit 0.95
for k in range(0, N):
    if k == 0:
        xx = x
        yy = y
    else:
        xx = x[0:-k]
        yy = y[0:-k]
    v = np.trapz(yy, xx)
    print(f"Integral {k} from {xx[0]} to {xx[-1]} is equal to {v}")
    if v <= 0.95:
        break
将numpy导入为np
将matplotlib.pyplot作为plt导入
N=1000
x=np.linspace(0.0,6.0*np.pi,N)
y=np.sin(x/2.0)/x#构造一些多峰函数
y[0]=y[1]
y=np.abs(y)
平面图(x,y,r.)
plt.show()
#规范化
norm=np.trapz(y,x)
印刷品(标准)
y=y/标准值
归一化后的打印(np.trapz(y,x))#
#现在计算积分,将右极限减一
#在每次迭代中,一旦达到0.95,就停止
对于范围(0,N)内的k:
如果k==0:
xx=x
yy=y
其他:
xx=x[0:-k]
yy=y[0:-k]
v=np.trapz(yy,xx)
print(f“从{xx[0]}到{xx[-1]}的积分{k}等于{v}”)

如果v我测试了@Severin-Pappadeux方法和np.percentile,bith给出了95%的相同结果

此处代码为@Severin Pappadeux,但使用的数据如下:

import numpy as np
import matplotlib.pyplot as plt


x = [ 5.  ,  5.55,  6.1 ,  6.65,  7.2 ,  7.75,  8.3 ,  8.85,  9.4 ,
      9.95, 10.5 , 11.05, 11.6 , 12.15, 12.7 , 13.25, 13.8 , 14.35,
      14.9 , 15.45, 16.  ]
y = [0.03234577, 0.03401444, 0.03559847, 0.03719304, 0.03890566,
     0.04084201, 0.04309067, 0.04570878, 0.04871024, 0.05205822,
     0.05566298, 0.05938525, 0.06304516, 0.06643575, 0.06933978,
     0.07154828, 0.07287886, 0.07319211, 0.0724044 , 0.0704957 ,
     0.0675117 ] 

N = len(x)

y[0] = y[1]
y = np.abs(y)

plt.plot(x, y, 'r.')
plt.show()

# normalization
norm = np.trapz(y, x)
print(norm)

y = y/norm
print(np.trapz(y, x)) # after normalization

# now compute integral cutting right limit down by one
# with each iteration, stop as soon as we hit 0.95
for k in range(0, N):
    if k == 0:
       xx = x
       yy = y
    else:
       xx = x[0:-k]
       yy = y[0:-k]
     v = np.trapz(yy, xx)
print(f"Integral {k} from {xx[0]} to {xx[-1]} is equal to {v}")

    if v <= 0.95:
       break

# Outputs = 
# 0.6057000785
# 1.0 
# Integral 0 from 5.0 to 16.0 is equal to 1.0
# Integral 1 from 5.0 to 15.45 is equal to 0.9373418687777172

因此,两种方法都给了我15.45作为x

95个百分位数,你想要x&y值的百分位数吗?或者你想在情节中注释它?@泽克我想要X的前科,但是我不应该考虑PDF(Y值)吗?百分位数是基于PDF值的。第95个百分位是x值,pdf下95%的区域位于其左侧(或5%位于右侧)。用微积分的术语来说,从无穷大到x的积分是0.95。经过一点探索,它看起来可能就是你想要的。假设你将二维数组设为
arr
,并将
x
值设为第二个一维数组。你可以这样做来得到百分位数<代码>np.百分位数(arr[1],0.95)
。希望这有帮助!您好@Severin Pappadeux,非常感谢您的代码,我运行了代码并将其与np.percentile的结果进行了比较,两者都给出了相同的结果。@sakurami如果您有np.percentile的替代版本,请将其作为另一个答案发布,我会支持它——它肯定会让寻找答案的人受益。@sakurami如果你不想共享实际数据,你甚至可以从我的代码中选择Y作为x的函数
np.percentile(x, 95)
# Output= 15.45