是否有一种方便的方法来计算一个序列或一维numpy数组的百分位数?
我正在寻找类似Excel的百分位数函数。
我在NumPy的统计参考中找不到这个。我所能找到的是中位数(第50百分位),但没有更具体的东西。
是否有一种方便的方法来计算一个序列或一维numpy数组的百分位数?
我正在寻找类似Excel的百分位数函数。
我在NumPy的统计参考中找不到这个。我所能找到的是中位数(第50百分位),但没有更具体的东西。
当前回答
我引导数据,然后绘制出10个样本的置信区间。置信区间表示概率在5%到95%之间的范围。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import json
import dc_stat_think as dcst
data = [154, 400, 1124, 82, 94, 108]
#print (np.percentile(data,[0.5,95])) # gives the 95th percentile
bs_data = dcst.draw_bs_reps(data, np.mean, size=6*10)
#print(np.reshape(bs_data,(24,6)))
x= np.linspace(1,6,6)
print(x)
for (item1,item2,item3,item4,item5,item6) in bs_data.reshape((10,6)):
line_data=[item1,item2,item3,item4,item5,item6]
ci=np.percentile(line_data,[.025,.975])
mean_avg=np.mean(line_data)
fig, ax = plt.subplots()
ax.plot(x,line_data)
ax.fill_between(x, (line_data-ci[0]), (line_data+ci[1]), color='b', alpha=.1)
ax.axhline(mean_avg,color='red')
plt.show()
其他回答
您可能会对SciPy Stats包感兴趣。它有你所追求的百分位数函数和许多其他统计上的好处。
Percentile()在numpy中也可用。
import numpy as np
a = np.array([1,2,3,4,5])
p = np.percentile(a, 50) # return 50th percentile, e.g median.
print p
3.0
这张票让我相信他们不会很快将percentile()集成到numpy中。
下面是如何在没有numpy的情况下,仅使用python来计算百分比。
import math
def percentile(data, perc: int):
size = len(data)
return sorted(data)[int(math.ceil((size * perc) / 100)) - 1]
percentile([10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0], 90)
# 9.0
percentile([142, 232, 290, 120, 274, 123, 146, 113, 272, 119, 124, 277, 207], 50)
# 146
如果你需要答案是输入numpy数组的成员:
再加上numpy中的百分位数函数默认情况下将输出计算为输入向量中两个相邻项的线性加权平均。在某些情况下,人们可能希望返回的百分位数是向量的实际元素,在这种情况下,从v1.9.0开始,您可以使用“插值”选项,使用“低”、“高”或“最近”。
import numpy as np
x=np.random.uniform(10,size=(1000))-5.0
np.percentile(x,70) # 70th percentile
2.075966046220879
np.percentile(x,70,interpolation="nearest")
2.0729677997904314
后者是向量中的一个实际条目,而前者是与百分位数相邻的两个向量条目的线性插值
我引导数据,然后绘制出10个样本的置信区间。置信区间表示概率在5%到95%之间的范围。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import json
import dc_stat_think as dcst
data = [154, 400, 1124, 82, 94, 108]
#print (np.percentile(data,[0.5,95])) # gives the 95th percentile
bs_data = dcst.draw_bs_reps(data, np.mean, size=6*10)
#print(np.reshape(bs_data,(24,6)))
x= np.linspace(1,6,6)
print(x)
for (item1,item2,item3,item4,item5,item6) in bs_data.reshape((10,6)):
line_data=[item1,item2,item3,item4,item5,item6]
ci=np.percentile(line_data,[.025,.975])
mean_avg=np.mean(line_data)
fig, ax = plt.subplots()
ax.plot(x,line_data)
ax.fill_between(x, (line_data-ci[0]), (line_data+ci[1]), color='b', alpha=.1)
ax.axhline(mean_avg,color='red')
plt.show()
对于系列:用于描述函数
假设df具有以下列sales和id。你想计算销售额的百分比,它是这样工作的,
df['sales'].describe(percentiles = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1])
0.0: .0: minimum
1: maximum
0.1 : 10th percentile and so on