كيف يمكنني حساب المئينات مع بيثون/numpy?
-
24-09-2019 - |
سؤال
هل هناك طريقة سهلة لحساب النسب المئوية على تسلسل أو أحادية الأبعاد numpy المصفوفة ؟
أنا أبحث عن شيء مماثل في Excel المئين وظيفة.
نظرت في NumPy إحصاءات المرجعية, و لم أجد هذا.كل ما وجدته هو متوسط (50%), ولكن لا شيء أكثر تحديدا.
المحلول
قد تكون مهتمًا بـ احصائيات Scipy صفقة. لديها وظيفة المئوية أنت بعد العديد من الأشياء الجيدة الإحصائية الأخرى.
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 في أي وقت قريب.
نصائح أخرى
بالمناسبة ، هناك تنفيذ Pure-Python لوظيفة النسبة المئوية, ، في حال لم يرغب المرء في الاعتماد على Scipy. يتم نسخ الوظيفة أدناه:
## {{{ http://code.activestate.com/recipes/511478/ (r1)
import math
import functools
def percentile(N, percent, key=lambda x:x):
"""
Find the percentile of a list of values.
@parameter N - is a list of values. Note N MUST BE already sorted.
@parameter percent - a float value from 0.0 to 1.0.
@parameter key - optional key function to compute value from each element of N.
@return - the percentile of the values
"""
if not N:
return None
k = (len(N)-1) * percent
f = math.floor(k)
c = math.ceil(k)
if f == c:
return key(N[int(k)])
d0 = key(N[int(f)]) * (c-k)
d1 = key(N[int(c)]) * (k-f)
return d0+d1
# median is 50th percentile.
median = functools.partial(percentile, percent=0.5)
## end of http://code.activestate.com/recipes/511478/ }}}
import numpy as np
a = [154, 400, 1124, 82, 94, 108]
print np.percentile(a,95) # gives the 95th percentile
إليك كيفية القيام بذلك بدون Numpy ، باستخدام Python فقط لحساب النسبة المئوية.
import math
def percentile(data, percentile):
size = len(data)
return sorted(data)[int(math.ceil((size * percentile) / 100)) - 1]
p5 = percentile(mylist, 5)
p25 = percentile(mylist, 25)
p50 = percentile(mylist, 50)
p75 = percentile(mylist, 75)
p95 = percentile(mylist, 95)
يتوقع تعريف النسبة المئوية التي أراها عادةً أن القيمة من القائمة المقدمة أدناه والتي تم العثور على P في المائة من القيم ... مما يعني أن النتيجة يجب أن تكون من المجموعة ، وليس الاستيفاء بين عناصر المحددة. للحصول على ذلك ، يمكنك استخدام وظيفة أبسط.
def percentile(N, P):
"""
Find the percentile of a list of values
@parameter N - A list of values. N must be sorted.
@parameter P - A float value from 0.0 to 1.0
@return - The percentile of the values.
"""
n = int(round(P * len(N) + 0.5))
return N[n-1]
# A = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# B = (15, 20, 35, 40, 50)
#
# print percentile(A, P=0.3)
# 4
# print percentile(A, P=0.8)
# 9
# print percentile(B, P=0.3)
# 20
# print percentile(B, P=0.8)
# 50
إذا كنت تفضل الحصول على القيمة من القائمة المقدمة عند أو أقل من P في المئة من القيم ، فاستخدم هذا التعديل البسيط:
def percentile(N, P):
n = int(round(P * len(N) + 0.5))
if n > 1:
return N[n-2]
else:
return N[0]
أو مع التبسيط الذي اقترحه ijustlovemath:
def percentile(N, P):
n = max(int(round(P * len(N) + 0.5)), 2)
return N[n-2]
تحقق من وحدة Scipy.stats:
scipy.stats.scoreatpercentile
لحساب النسبة المئوية لسلسلة ، قم بتشغيل:
from scipy.stats import rankdata
import numpy as np
def calc_percentile(a, method='min'):
if isinstance(a, list):
a = np.asarray(a)
return rankdata(a, method=method) / float(len(a))
علي سبيل المثال:
a = range(20)
print {val: round(percentile, 3) for val, percentile in zip(a, calc_percentile(a))}
>>> {0: 0.05, 1: 0.1, 2: 0.15, 3: 0.2, 4: 0.25, 5: 0.3, 6: 0.35, 7: 0.4, 8: 0.45, 9: 0.5, 10: 0.55, 11: 0.6, 12: 0.65, 13: 0.7, 14: 0.75, 15: 0.8, 16: 0.85, 17: 0.9, 18: 0.95, 19: 1.0}
بدء Python 3.8
, ، المكتبة القياسية تأتي مع quantiles
تعمل كجزء من statistics
وحدة:
from statistics import quantiles
quantiles([1, 2, 3, 4, 5], n=100)
# [0.06, 0.12, 0.18, 0.24, 0.3, 0.36, 0.42, 0.48, 0.54, 0.6, 0.66, 0.72, 0.78, 0.84, 0.9, 0.96, 1.02, 1.08, 1.14, 1.2, 1.26, 1.32, 1.38, 1.44, 1.5, 1.56, 1.62, 1.68, 1.74, 1.8, 1.86, 1.92, 1.98, 2.04, 2.1, 2.16, 2.22, 2.28, 2.34, 2.4, 2.46, 2.52, 2.58, 2.64, 2.7, 2.76, 2.82, 2.88, 2.94, 3.0, 3.06, 3.12, 3.18, 3.24, 3.3, 3.36, 3.42, 3.48, 3.54, 3.6, 3.66, 3.72, 3.78, 3.84, 3.9, 3.96, 4.02, 4.08, 4.14, 4.2, 4.26, 4.32, 4.38, 4.44, 4.5, 4.56, 4.62, 4.68, 4.74, 4.8, 4.86, 4.92, 4.98, 5.04, 5.1, 5.16, 5.22, 5.28, 5.34, 5.4, 5.46, 5.52, 5.58, 5.64, 5.7, 5.76, 5.82, 5.88, 5.94]
quantiles([1, 2, 3, 4, 5], n=100)[49] # 50th percentile (e.g median)
# 3.0
quantiles
عوائد لتوزيع معين dist
قائمة n - 1
قطع النقاط التي تفصل بين n
الفواصل الزمنية الكمية (تقسيم dist
داخل n
فواصل زمنية مستمرة مع احتمال متساوٍ):
statistics.quantiles (dist ، *، n = 4 ، method = 'الحصري')
أين n
, ، في حالتنا هذه (percentiles
) هو 100
.
في حال كنت بحاجة إلى الإجابة أن تكون عضوا في المدخلات 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
وهذا الأخير هو الفعلي الدخول في ناقلات ، في حين أن السابق هو الخطية من اثنين من ناقلات الإدخالات التي تقع على الحدود المئوية
لسلسلة: المستخدمة وصف الوظائف
لنفترض أن لديك DF مع مبيعات الأعمدة والمعرف التالي. تريد حساب النسب المئوية للمبيعات ثم يعمل مثل هذا ،
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