【问题标题】:Google BigQuery APPROX_QUANTILES and getting true quartilesGoogle BigQuery APPROX_QUANTILES 并获得真正的四分位数
【发布时间】:2018-06-27 20:25:34
【问题描述】:

根据docs

返回一组表达式值的近似边界,其中数字表示要创建的分位数。该函数返回一个 number + 1 个元素组成的数组,其中第一个元素是近似最小值,最后一个元素是近似最大值。

听起来如果我想要真正的四分位数,我需要使用APPROX_QUANTILES(values, 4),它将返回[minvalue, 1st quartile, 2nd quartile, 3rd quartile, maxvalue]

根据https://en.wikipedia.org/wiki/Quartile,四分位数集包含 3 个数据点 - 其中没有一个是数据的最小值/最大值。

我的假设正确吗? APPROX_QUANTILES(values, 4) 会返回真正的四分位数吗?

【问题讨论】:

  • 您的问题是什么?是如何返回删除第一个元素的数组?
  • 已编辑以使问题更清楚 - 我会得到 4 的四分位数吗?

标签: statistics google-bigquery quantile percentile quartile


【解决方案1】:

作为基线,这是未经任何修改的输出,使用 1 到 100 之间的数字输入:

SELECT APPROX_QUANTILES(x, 4) AS output
FROM UNNEST(GENERATE_ARRAY(1, 100)) AS x;
+----------------------------+
|           output           |
+----------------------------+
| ["1","25","50","75","100"] |
+----------------------------+

输出包括最小值 (1) 和最大值 (100)。如果您只想要四分位数,则需要从数组中删除它们。为了可读性/可组合性,最好使用临时 SQL UDF 来执行此操作。这里我使用INT64 作为元素类型,但您也可以使用不同的元素类型:

CREATE TEMP FUNCTION StripFirstLast(arr ARRAY<INT64>) AS (
  ARRAY(SELECT x FROM UNNEST(arr) AS x WITH OFFSET
  WHERE OFFSET BETWEEN 1 AND ARRAY_LENGTH(arr) - 2)
);

SELECT
  APPROX_QUANTILES(x, 4) AS output,
  StripFirstLast(APPROX_QUANTILES(x, 4)) AS quartiles
FROM UNNEST(GENERATE_ARRAY(1, 100)) AS x;
+----------------------------+------------------+
|           output           |    quartiles     |
+----------------------------+------------------+
| ["1","25","50","75","100"] | ["25","50","75"] |
+----------------------------+------------------+

您可以看到quartiles 数组只包含所需的值。

【讨论】:

  • 感谢你把这个例子放在一起,它完美地展示了逻辑。
猜你喜欢
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2018-12-25
  • 2011-04-13
  • 2020-07-08
  • 2016-05-11
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多