""" This is the implementation of inter_quartile range (IQR). function takes the list of numeric values as input and return the IQR as output. Script inspired from its corresponding Wikipedia article https://en.wikipedia.org/wiki/Interquartile_range """ import numpy as np def find_median(x: np.array) -> float: """ This is the implementation of median. :param x: The list of numeric values :return: Median of the list >>> find_median(x=np.array([1,2,2,3,4])) 2 >>> find_median(np.array([1,2,2,3,4,4])) 2.5 """ length = len(x) if length % 2: return x[length // 2] return float((x[length // 2] + x[(length // 2) - 1]) / 2) def interquartile_range(x: np.array) -> float: """ This is the implementation of inter_quartile range for a list of numeric. :param x: The list of data point :return: Inter_quartile range >>> interquartile_range(x=np.array([4,1,2,3,2])) 2.0 >>> interquartile_range(x=np.array([25,32,49,21,37,43,27,45,31])) 18.0 """ length = len(x) if length == 0: raise ValueError("The list is empty. Provide a non-empty list.") x.sort() div, mod = divmod(length, 2) q1 = find_median(x[:div]) half_length = sum((div, mod)) q3 = find_median(x[half_length:length]) return q3 - q1 if __name__ == "__main__": import doctest doctest.testmod()