sql:计算相关性并将行转换为列
Posted
技术标签:
【中文标题】sql:计算相关性并将行转换为列【英文标题】:sql: Calculate the correlations and convert rows into columns 【发布时间】:2021-09-13 19:33:55 【问题描述】:所以我当前的表有 100 多个字段,我正在尝试计算输入变量和输出变量之间的相关性,然后将所有这些列转换为行。 例如,我当前的表如下所示:
input_1 | input_2 | output |
---|---|---|
3 | 6 | 5 |
4 | 7 | 5 |
6 | 4 | 4 |
6 | 9 | 3 |
7 | 10 | 5 |
9 | 9 | 2 |
2 | 9 | 4 |
我想要实现的是:
categories | correlation |
---|---|
input_1 | -0.594 |
input_2 | -0.27 |
我在下面编写的查询为每个计算提供了一个相关性。但是,我是把它们转换成行,
select (Avg(input1 * output) - (Avg(input1) * Avg(output))) / (stddev(input1) * stddev(output)) AS correlation
from a
您能帮助实现这一目标吗? 谢谢!
【问题讨论】:
@MikhailBerlyant 这是我们上次评论的问题 【参考方案1】:考虑以下方法
execute immediate (select '''
select categories, correlation
from (
select ''' ||
string_agg('corr(' || category || ', output) as ' || category , ', ')
|| ''' from `project.dataset.table`
)
unpivot (correlation for categories in (''' || string_agg(category) || '''))
'''
from (
select category from (
select
array(
select category
from unnest(regexp_extract_all(to_json_string(t), r'"(\w+)":')) category
where category != 'output'
) arr
from `project.dataset.table` t
limit 1
), unnest(arr) category
))
如果应用于您问题中的样本数据 - 输出是
如您所见 - 我没有使用您的繁重公式 - 而是使用 CORR 内置函数
【讨论】:
以上是关于sql:计算相关性并将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章