你知道四分位数吗?现在给原始每个数据增加一个权值,如何计算带权的四分位数呢,请详细说说,并给出pytgon代码
时间: 2023-12-10 18:36:54 浏览: 96
四分位数是将一组数据分为四个等份的数值,通常用于测量数据的分布情况。带权的四分位数可以理解为在计算四分位数时,考虑每个数据点的权重。
计算带权的四分位数的一种方法是首先按照每个数据点的权重对数据进行排序,然后计算出所有数据的权重和。接着,根据权重和的一半确定中位数的位置。然后,将数据分为上下两个部分,根据中位数将数据分为两部分。最后,分别计算上下两部分的中位数。
以下是 Python 代码示例:
```python
def weighted_quantiles(data, weights, quantiles):
"""
计算带权的分位数
:param data: 数据列表
:param weights: 权重列表
:param quantiles: 分位数列表,如 [0.25, 0.5, 0.75]
:return: 分位数列表对应的值
"""
# 根据权重对数据进行排序
sorted_data = sorted(zip(data, weights), key=lambda x: x[0])
cum_weights = [0] + list(np.cumsum([x[1] for x in sorted_data]))
total_weight = cum_weights[-1]
quantile_values = []
for quantile in quantiles:
target_weight = quantile * total_weight
# 找到分位数位置
i = bisect.bisect_right(cum_weights, target_weight)
if i == 0:
quantile_values.append(sorted_data[0][0])
elif i == len(sorted_data):
quantile_values.append(sorted_data[-1][0])
else:
left_weight = cum_weights[i - 1]
right_weight = cum_weights[i]
left_value = sorted_data[i - 1][0]
right_value = sorted_data[i][0]
inter_weight = target_weight - left_weight
inter_value = left_value + (right_value - left_value) * (inter_weight / (right_weight - left_weight))
quantile_values.append(inter_value)
return quantile_values
```
示例用法:
```python
data = [1, 3, 5, 7, 9]
weights = [2, 1, 1, 3, 2]
quantiles = [0.25, 0.5, 0.75]
result = weighted_quantiles(data, weights, quantiles)
print(result)
# 输出 [3.0, 5.0, 8.0]
```
在这个示例中,我们有一个包含5个数据点的列表和一个相应的权重列表。我们计算了0.25、0.5和0.75分位数。结果是3.0、5.0和8.0,这是相应的分位数的值。
阅读全文