min=Q1-1.5*(Q3-Q1)
、max=Q3+1.5*(Q3-Q1)
實現邏輯:
- 先獲取總樣本的中位數Q2及其索引;
- 然後用Q2的索引把總樣本等分稱兩部分;
- 然後以相同的邏輯來獲取被等分後的兩部分的中位數,即Q1和Q3;
- 最終返回 Q1,Q2,Q3;
- 我們可以根據Q1,Q3計算獲得最小min、最大值max。
import numpy as np
import math
def do_cal_min_max(q1, q3):
"""計算最小、最大值"""
min = q1 - 1.5 * (q3 - q1)
max = q3 + 1.5 * (q3 - q1)
return min, max
def get_mid_idx(data):
"""獲取中位數的索引,如果是偶數個,則是最中間兩個數的索引的平均值"""
length = len(data)
if length % 2 == 0:
idx1 = length / 2 - 1
idx2 = idx1 + 1
idx = np.mean([idx1, idx2])
else:
idx = math.ceil(length / 2)
return idx
def do_cal_quarter(data):
"""計算四分位數:四分位數是通過3個點(Q1,Q2, Q3)將全部數據等分為4部分,其中每部分包含25%的數據。 Q1:下四分位數,等於該樣本中所有數值由小到大排列後第25%的數; Q2:中位數,等於該樣本中所有數值由小到大排列後第50%的數; Q3:上四分位數,等於該樣本中所有數值由小到大排列後第75%的數。 """
# 先從小到大排序
data.sort()
# 先獲取中位數索引和中位數
idx = get_mid_idx(data)
q2 = np.median(data)
# 被中位數索引等分的兩部分
part1 = [v for i, v in enumerate(data) if i < idx]
part2 = [v for i, v in enumerate(data) if i > idx]
# 獲取下四分位數
q1 = np.median(part1)
# 獲取上四分位數
q3 = np.median(part2)
return q1, q2, q3
def main():
"""主函數"""
data = [-1, -2, -3, -4, -5]
# 獲取Q1,Q2,Q3
q1, q2, q3 = do_cal_quarter(data)
print(q1, q2, q3)
# 獲取最小min、最大值max
min, max = do_cal_min_max(q1, q3)
print(min, max)
if __name__ == '__main__':
main()