线性插值法计算百分位数

538 阅读1分钟
 /**
 * 线性插值法计算百分位数 又称 四分位数
 * @param { Array } arr 一维数组
 * @param { Number } p 百分比
 */
 function percent(arr = [], p = 0) {
      // 1-排序
      arr.sort((a, b) => a - b)
      // 2-找到需要的分位数对应位置
      let loc = 1 + (arr.length - 1) * (p / 100)
      if( Math.floor(loc) === loc ){
        loc= loc+'.0'
      }
      // 3-判断loc是否为整数
      let locArr = String(loc).split('.')
      let loc_int = Number(locArr[0])
      let loc_float = Number(locArr[1])
      let res = 0
      if (loc_float == 0) {
        res = arr[loc_int - 1]
      } else {
        res = arr[loc_int - 1] + (arr[loc_int] - arr[loc_int - 1]) * (loc - loc_int)
      }
      return res
 }
import numpy as np

a = [1, 3, 5, 7, 9, 16, 2, 6, 10]

print(np.percentile(a, 25))
# 输出 3

b = [1, 3, 5, 7, 9, 16, 2, 6, 10, 35]
print(np.percentile(b, 25))
# 输出 3.5

c = [1, 3, 5, 7, 9, 16, 2, 6, 10, 35, 0.3, 7.9, 8, 3.2]
print(np.percentile(c, 25))
# 输出 3.05

#%% 自定义函数
def percentile_yu(data, p):
    # 1-排序
    data.sort()
    # 2-找到需要的分位数对应位置
    loc = 1 + (len(data)  - 1) * (p/100)
    # 3-判断loc是否为整数
    loc_int = int(str(loc).split ('.')[0]) # loc的整数部分
    loc_float = int(str(loc).split ('.')[1])  #loc的小数部分
    if loc_float == 0:
        res = data[loc_int - 1]
    else:
        res = data[loc_int-1] + (data[loc_int] - data[loc_int-1]) * (loc-loc_int)
    return res
print(percentile_yu(a, 25))
# 输出 3
print(percentile_yu(b, 25))
# 输出 3.5
print(percentile_yu(c, 25))
# 输出 3.05