尝试通过平均值进行聚合,然后根据kdb中的平均值修剪观测值的异常值
我试图按项目类型找到平均值,然后设置一个变量y,该变量接受该值:尝试通过平均值进行聚合,然后根据kdb中的平均值修剪观测值的异常值,kdb,q-lang,Kdb,Q Lang,我试图按项目类型找到平均值,然后设置一个变量y,该变量接受该值: 如果x=0,则缺少值 y=x。然后舍入太大或太小的值: 如果x>0,x>mu,则设置y=mu 如果x0)和(x>mu) q) tab2:从tab2更新y:mu,其中(x可以在一行中完成: tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过tab2中的项目更新mu:avg x),其中x0您可以在一行中完成此操作: tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过t
tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
tabsum: select mu:avg x by items from tab2;
tab2: update y:x from tab2
tab2: update y:mu from tab2 where x > 0 and x > mu / get error after running above step
tab2: update y:mu from tab2 where x < 0 and x <= mu
与此数据相关:
i) NaN是kdb中缺少值的适当类型吗?(NA
不同于R中的NaN
或NULL
)。我是根据我到目前为止所读到的来猜的
ii)是否有更有效的代码将mu列放入tab2
?我猜,创建另一个表并合并并不高效(仍在学习kdb的基础知识)
(iii)
如果我只是跑
tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
tabsum: select mu:avg x by items from tab2;
tab2: update y:mu from tab2 where x > 0 and x > mu
我得到:
items x mu y
1 a -6 -3.0 NaN
2 b 8 6.5 6.5
3 a 0 -3.0 NaN
4 a -3 -3.0 NaN
5 b 5 6.5 6.5
第五行对我来说毫无意义。如果xiv)如何获得所需的结果(我发布的代码工作不正常)这可能不是最漂亮的解决方案,但似乎符合您的标准。我正在使用向量条件
?
设置y的值:
q)show tab3: update y:?[((x>0) and x>mu) or ((x<0) and x<=mu);mu;x] from update mu:avg x by items from tab2
items x mu y
----------------
a -6 -3 -3
b 8 6.5 6.5
a 0 -3 0
a -3 -3 -3
b 5 6.5 5
最后一行的意外结果取决于执行顺序;q代码从右向左执行。因此:
5>0 and 5>6.5
实际上是指:
5>(0 and 5>6.5)
即:
5>0
结果是真的。要进行所需的比较,需要使用括号:
q)(5>0) and 5>6.5
0b
您的代码块无法工作有几个原因。在第2行,不使用mu
列更新tab2
;您只需创建一个新表。因此,当您尝试在第4行使用mu
时,它不存在(这将导致错误)。在第3行,您将y
的值设置为与x
相同,但这也意味着相同的类型(整数)。然后,稍后当您尝试从mu
将y
重置为浮点值时,您会得到一个类型的错误
下面是一段与您的代码类似的代码:
q)tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
q)tab2: update mu:avg x by items from tab2
q)tab2: update y:"f"$x from tab2
q)tab2: update y:mu from tab2 where (x>0) and (x> mu)
q)tab2: update y:mu from tab2 where (x<0) and (x<= mu)
q)tab2
items x mu y
----------------
a -6 -3 -3
b 8 6.5 6.5
a 0 -3 0
a -3 -3 -3
b 5 6.5 5
q)表2:([]项:`a`b`a`a`b;x:-680-35)
q) tab2:根据tab2中的项目更新mu:avg x
q) tab2:更新y:“f”$x自tab2
q) tab2:从tab2更新y:mu,其中(x>0)和(x>mu)
q) tab2:从tab2更新y:mu,其中(x这可能不是最漂亮的解决方案,但似乎符合您的标准。我正在使用向量条件?
设置y的值:
q)show tab3: update y:?[((x>0) and x>mu) or ((x<0) and x<=mu);mu;x] from update mu:avg x by items from tab2
items x mu y
----------------
a -6 -3 -3
b 8 6.5 6.5
a 0 -3 0
a -3 -3 -3
b 5 6.5 5
最后一行的意外结果取决于执行顺序;q代码从右到左执行。因此:
5>0 and 5>6.5
实际上是指:
5>(0 and 5>6.5)
即:
5>0
其计算结果为true。要进行所需的比较,需要使用括号:
q)(5>0) and 5>6.5
0b
代码块不起作用有几个原因。在第2行,您不使用mu
列更新tab2
;您只需创建一个新表。因此,当您尝试在第4行使用mu
时,它不存在(这将导致错误)。在第3行,您将y
的值设置为与x
相同,但这也意味着相同的类型(整数)。然后,当您尝试将y
重置为mu
中的浮点值时,您会得到一个类型的错误
下面是一段与您的代码类似的代码:
q)tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
q)tab2: update mu:avg x by items from tab2
q)tab2: update y:"f"$x from tab2
q)tab2: update y:mu from tab2 where (x>0) and (x> mu)
q)tab2: update y:mu from tab2 where (x<0) and (x<= mu)
q)tab2
items x mu y
----------------
a -6 -3 -3
b 8 6.5 6.5
a 0 -3 0
a -3 -3 -3
b 5 6.5 5
q)表2:([]项:`a`b`a`a`b;x:-680-35)
q) tab2:根据tab2中的项目更新mu:avg x
q) tab2:更新y:“f”$x自tab2
q) tab2:从tab2更新y:mu,其中(x>0)和(x>mu)
q) tab2:从tab2更新y:mu,其中(x可以在一行中完成:
tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过tab2中的项目更新mu:avg x),其中x0
您可以在一行中完成此操作:
tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过tab2中的项目更新mu:avg x),其中x0
感谢链接和解释!有意义链接和解释!有意义