You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spotfire加权中位数函数查询及自定义代码/表达式构建求助

加权中位数函数实现方案

一、是否存在内置加权中位数函数?

多数数据分析工具(如BI平台、数据处理系统)并未直接提供WeightedMedian()这类内置函数,需要通过自定义表达式或函数来实现。

二、自定义加权中位数的实现方法

1. 核心计算逻辑

加权中位数的计算遵循以下步骤:

  • 将values按从小到大排序,对应weight同步排序
  • 计算权重累计和,找到累计和首次超过总权重一半的位置,对应的value即为加权中位数
  • 若累计和恰好等于总权重一半,取该位置与下一个位置value的平均值

2. 自定义表达式公式(适用于表达式编辑器)

假设工具支持窗口函数与聚合函数,可通过以下逻辑构建表达式:

-- 计算总权重的一半
SET total_half = SUM(weight) / 2;

-- 排序并计算累计权重
WITH sorted_data AS (
    SELECT value, weight,
           SUM(weight) OVER (ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_weight
    FROM your_table
)

-- 确定加权中位数
SELECT CASE
    WHEN MAX(CASE WHEN cumulative_weight <= total_half THEN cumulative_weight END) = total_half THEN
        (SELECT AVG(value) FROM sorted_data WHERE cumulative_weight >= total_half)
    ELSE
        (SELECT value FROM sorted_data WHERE cumulative_weight > total_half ORDER BY value LIMIT 1)
    END AS weighted_median
FROM sorted_data;

3. 自定义函数代码(按路径Data->Data Function Properties->Expression Functions->New创建)

以下是适配多数平台的通用函数实现:

def WeightedMedian(w, v):
    # 配对权重与数值并按数值排序
    paired = sorted(zip(v, w), key=lambda x: x[0])
    values_sorted, weights_sorted = zip(*paired)
    
    total_weight = sum(weights_sorted)
    half_total = total_weight / 2
    cumulative = 0
    
    for idx, (val, wt) in enumerate(zip(values_sorted, weights_sorted)):
        cumulative += wt
        if cumulative > half_total:
            return val
        elif cumulative == half_total:
            # 取当前值与下一个值的平均值
            next_val = values_sorted[idx + 1]
            return (val + next_val) / 2
    return values_sorted[-1]  # 处理单值边界情况

4. 示例验证

用你提供的测试数据:

  • weight = [100,210,30,50],values = [1,2,3,4]
  • 排序后配对数据:(1,100), (2,210), (3,30), (4,50)
  • 总权重:390,一半为195
  • 累计权重:100(<195)→ 100+210=310(>195),最终加权中位数为2

内容的提问来源于stack exchange,提问作者Easyhyum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:57:09