2014-01-09 50 views
1

我是KDB/Q的新手,並且有一個關於獲取兩個(不一定相鄰)行之間區別的問題。KDB/Q中的行之間的區別

我只有一個表,它看起來像下面:

q)tickers:`ibm`bac`dis`gs`ibm`gs`dis`bac 
q)pxs:100 50 30 250 110 240 45 48 
q)dates:2013.05.01 2013.01.05 2013.02.03 2013.02.11 2013.06.17 2013.06.21 2013.04.24 2013.01.06 

q)trades:([tickers;dates];pxs) 
q)trades 
tickers dates  | pxs 
------------------| --- 
ibm  2013.05.01| 100 
bac  2013.01.05| 50 
dis  2013.02.03| 30 
gs  2013.02.11| 250 
ibm  2013.06.17| 110 
gs  2013.06.21| 240 
dis  2013.04.24| 45 
bac  2013.01.06| 48 

我希望能夠在存儲當前和以前的價格之間的差額表中的一個或者另一個列,或結構相似的其他結構。由此產生的需要回答的關鍵問題是「股價變化與前一次價格變化相比有多大變化?」

到目前爲止,我已經試過沿着線的東西:

select tickers, dates, pxs - pxs(dates bin (exec dates from trades where tickers = trades.tickers)) from trades 

其並未真正發揮作用(所有)。絕對是因爲試圖做類似SQL的查詢並且有一個面向行的思維模式。

請找到的個例低於追捧答案:

q)trades: do magic with trades 
q)trades 
tickers dates  | pxs | delta 
------------------| --- | ----- 
ibm  2013.05.01| 100 | 0 
bac  2013.01.05| 50 | 0 
dis  2013.02.03| 30 | 0 
gs  2013.02.11| 250 | 0 
ibm  2013.06.17| 110 | 10 
gs  2013.06.21| 240 | -10 
dis  2013.04.24| 45 | 15 
bac  2013.01.06| 48 | -2 

感謝您的幫助, 丹

回答

5
q)update delta:{0,1_deltas x}pxs by tickers from trades 
    tickers dates  | pxs delta 
    ------------------| --------- 
    ibm  2013.05.01| 100 0 
    bac  2013.01.05| 50 0 
    dis  2013.02.03| 30 0 
    gs  2013.02.11| 250 0 
    ibm  2013.06.17| 110 10 
    gs  2013.06.21| 240 -10 
    dis  2013.04.24| 45 15 
    bac  2013.01.06| 48 -2 
+0

非常好,非常感謝! – user1158959

+0

澄清內聯匿名函數'{0,1_deltas x}':逗號是列表連接運算符,'1_'表示從delta結果中刪除第一個條目。由於函數被調用時沒有使用''''或'each',函數只能在整列數據中調用一次。如果'0,1_'被刪除,第一個delta將是'100',這通常是不希望的行爲。 – kevinarpe

1

如果你這樣做:

select pxs by dates,tickers from table 

你將有一個複雜的列(pxs)這是特定日期和代碼的價格列表。然後你可以應用三角洲:

select deltas pxs by dates,tickers from table 

這會給你的運行差異。第一個值是原來的P-XS雖然所以你需要更新的第一個0

編輯

只是重新閱讀並已經看了你的結果,你需要加入回你原貿易表

+0

感謝您的回答 – user1158959

1

更新日期,PXS,三角洲:從交易票 選擇P-XS:(0N( - - 1_ P-XS)1_ P-XS)的行情從行業

請找到它是如何工作的 創建表的哪些行包含:票和列表pxs。 所以每行中,我們有一個列表:

 
tickers| pxs 
-------| ------- 
bac | 50 48 
dis | 30 45 
gs  | 250 240 
ibm | 100 110 

現在我們要應用功能,將計算三角洲。上面提到的最佳功能:增量,但我的版本差不多。

如果我們選擇 - 那麼我們將有表格列表中的增量列表,但是我們使用update .. by,然後它取消組合的值。

+0

解釋你的答案的一些措辭會使這個答案有用;簡單地輸入代碼實際上並不重要,因爲它沒有有效地教導。 – Joe

+0

感謝您的回答,非常有用。 – user1158959