KDB: выбрать и округлить каждый ряд - PullRequest
0 голосов
/ 23 ноября 2018

Я создал свою собственную функцию округления:

.q.rnd:{$[x < 0; -1; 1] * floor abs[x] + 0.5}

У меня есть таблица Test со строковым столбцом COL

select  "F"$(COL) from Test

24549.18741328
48939.50717263
-274853.33568872
-24549.18741328
298753.62574861
84822.70074144
-7468840.64371524
117944.21228603
-117944.21228603
7468840.64371524
-7468840.64371524

Я хочу получить таблицу, которая бы округлялаот записей в тесте

Можно подумать, что приведенное ниже утверждение будет работать.Но это не так.

select .q.rnd "F"$(COL) from Test

Я получаю ошибку «тип».Итак, как мне округлить записи?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Чтобы добавить к тому, что сказал Шон, если вы хотите также использовать свою функцию, вы можете использовать each, который будет применять .q.rnd к каждому элементу в списке.

q)select .q.rnd each "F"$x from t
x
-----
-3928
5171
5160
-4067
-1781
3018
-7850
5347
-7112
-4116

, но с использованием select "F"$x from t лучше, поскольку оно векторизовано.

q)\t:1000 select "j"$"F"$x from t
22
q)\t:1000 select .q.rnd each "F"$x from t
33

Также следует отметить, что пространство имен .q не является обязательным и «зарезервировано для использования kx».Многие функции q по умолчанию находятся в пространстве имен .q, и всегда есть вероятность, что будущие обновления kdb могут добавить .q.rnd, который имеет другое поведение и нарушит любой код, в котором вы использовали свою функцию.

0 голосов
/ 23 ноября 2018

Результат, если условное условие if-else должно быть атомным логическим значением.Когда вы запускаете .q.rnd для столбца, вы работаете со списком, и x<0 возвращает список логических значений, а не атома.Условный вектор: ?

Тем не менее, похоже, что вы все равно хотите получить результирующее целое / длинное число, поэтому просто используйте parse здесь

q)t:([]string (10?-1 1)*10?10000f)
q)select  "F"$x from t
x
-------------------
4123.1701336801052
-9877.8444156050682
-3867.3530425876379
7267.8099689073861
4046.5459413826466
-8355.0649625249207
6427.3701561614871
-5830.2619284950197
1424.9352994374931
-9149.8820902779698
q)select  "j"$"F"$x from t
x
-----
4123
-9878
-3867
7268
4047
-8355
6427
-5830
1425
-9150
...