2015-12-13 5 views
1

Как применить функцию к каждому элементу массива в kdb? Например, чтобы умиротворять массив чисел на разных языках:kdb array map - как применить функцию к каждому элементу массива?

javascript: [1,2,3,4].map(square)   -> [1,4,9,16] 
python:  [square(x) for x in [1,2,3,4]] -> [1,4,9,16] 
kdb:  {[x] x*x} (1;2;3;4)   -> 1 4 9 16 

Так я думал, что написать еще одну функцию, которая принимает дату и возвращает имя файла CSV для этой даты:

q)gobble:{[x] string[x-1970.01.01],".csv"} 
q)gobble .z.d // .z.d == today 
"16781.csv" 

Hurray. Так что теперь я должен быть в состоянии применить эту функцию в массив дат и получить массив строк в ответ, подумал я Дурак смертным:

q)gobble .z.d + til 5 // .z.d + til 5 == array of 5 days starting today 
"16781" 
"16782" 
"16783" 
"16784" 
"16785" 
"." 
"c" 
"s" 
"v" 

Очевидно квадратуры в КДБ был особый случай какой-то, не для обобщения ко всем функциям. Как я могу сказать KDB применить произвольную функцию к каждой дате по очереди, пожалуйста? Большое спасибо!

ответ

2

См each

q)gobble each .z.d + til 5 
    "16782.csv" 
    "16783.csv" 
    "16784.csv" 
    "16785.csv" 
    "16786.csv" 

Квадратная операция работала * может работать на атомах, а также списки

q)1 2 3 4 * 1 2 3 4 
    1 4 9 16 
+0

Спасибо, это билет! –

4

Каждый полезно, но желательно, чтобы избежать его там, где это возможно, как это обычно медленно. Слэш t ниже возвращает тайминги для запуска функции, вы можете видеть, что gobble2 быстрее. Посмотрите в наречие

q)gobble:{[x] string[x-1970.01.01],".csv"} q)\t gobble each .z.d + til 300200 221 q)gobble2:{[x] string[x-1970.01.01],\:".csv"} q)\t gobble2 .z.d + til 300200 76

+0

Интересно. Это звучит так, как будто в этом тайме скрывается «мышление в kdb». Почему он быстрее? Благодарим вас за рекомендации наречия. Эта (ссылка), кажется, адресована наречиям в глубину. Я прочитаю его сегодня вечером, если ничего не вытеснит! http://www.firstderivatives.com/downloads/q_for_Gods_September_2013.pdf –

0

Других изменения (не лучше, чем наречие каждого права)

q) f:{[x] string[((),x)-1970.01.01] cross enlist ".csv"} /() is used to cover case when x is atom 

Если функция атомная (которая будет работать по каждому пункту списка) вы не должны используйте каждую (и другую вариацию цикла). Многие встроенные функции Q являются атомарными для ex. 'string' или '*' в функции выше.

В вашей функции вы используете запятую ',' оператор, который просто добавляет 2 элемента (2 списка в вашей строке case [x-1970.01.01] и ".csv"), а не атома в этом контексте. Следовательно, необходим элемент цикла.