【问题标题】:How do I calculate the standard deviation of a table in kdb如何计算 kdb 中表的标准差
【发布时间】:2021-05-06 20:34:52
【问题描述】:

我有一张要计算标准差的收益表。我的列看起来像

`day1`day2`day3 

如何有效计算每列的标准差?

我知道有一个开发函数。但是,与 avg 不同,dev 不能在整个表上调用 任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 考虑编辑您的问题以包含您迄今为止尝试过的代码以及您在使用该代码时遇到的问题。

标签: kdb


【解决方案1】:

是的,dev 不支持将表作为输入,但您可以在选择查询中的各个列上使用 dev

q)t:([]day1:til 10;day2:2*til 10;day3:3*til 10)
q)t
day1 day2 day3
--------------
0    0    0
1    2    3
2    4    6
3    6    9
4    8    12
5    10   15
6    12   18
7    14   21
8    16   24
9    18   27

q)select dev day1, dev day2, dev day3 from t
day1     day2     day3
--------------------------
2.872281 5.744563 8.616844

Edt:如果不确定如何使用函数形式创建动态查询,请使用解析:

q)parse"select dev day1 from t"

?
`t
()
0b
(,`day1)!,(dev;`day1)

这对于为多列创建代码很有用:

// [table;where;by;cols]
?[t;();0b;

    raze { (enlist x)!enlist (dev;x) } each `day1`day2`day3]

day1     day2     day3
--------------------------
2.872281 5.744563 8.616844

或者由于您有 100 多列,请使用 colsexcept 来获取您想要获得标准差的所有列,并忽略您不需要的列

?[t;();0b;

    raze { (enlist x)!enlist (dev;x) } each except[cols[t];`columns`to`ignore]

【讨论】:

  • 是否有系统的方法可以做到这一点,因为如果我有 100 多列怎么办。选择一项将是太多的工作
  • 非常感谢!
【解决方案2】:

如果您的桌子是“可翻转的”,那么您可以这样做:

q)enlist dev each flip t
day1     day2     day3
--------------------------
2.872281 5.744563 8.616844

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2019-09-22
    • 2016-04-14
    • 2020-01-28
    • 2015-12-27
    • 2020-02-28
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多