有序集合間的對位運算

有序集合間的對位運算,包括比較運算(>,<, 等於)和四則運算(+,-,*,/,%,\)。本問中討論的集合,都是有序集合,有序集合的成員是有次序的。有序集合間的對位運算,會按照順序使用對位成員進行比較或者四則運算。ide

1. 比較兩個集合的大小

集合可使用符號 ">" 或 "<" 比較大小,從第一個成員開始按照順序比較對位成員。例如 [1,3,1] 與[1,2,2]比較大小時,首先比較各自的第一個成員,1 與 1 相等;繼續比較各自的第二個成員,由於 3>2,因此 [1,3,1] 大於[1,2,2],無需比較後面的成員了。函數

【例 1】 以奧運會獎牌榜爲例,查詢哪幾屆奧運會中國獎牌榜排名比俄羅斯靠前。部分數據以下:spa

 

Game Nation Medal Game
30 USA 46,29,29 30
30 China 38,27,23 30
30 UK 29,17,19 30
30 Russia 24,26,32 30
30 Korea 13,8,7 30

奧運獎牌榜的規則是:首先對比金牌數量,金牌數高的排名靠前,金牌數低的排名靠後,金牌數相同的將會按照銀牌數再次對比排名。銀牌數高的排名靠前,銀牌數低的排名靠後,銀牌數相同的將會按照銅牌數再次對比排名。以此類推,銅牌數也相同的國家排名並列。code

【SPL 腳本】qt


A B
1 =file("Olympic.csv").import@cqt() /導入奧運會歷屆排名
2 =A1.run(Medal=Medal.split@c()) /獎牌字段按逗號拆分爲獎牌數集合
3 =A2.group(Game) /按每屆分組
4 =A3.select(~.select(Nation=="China").Medal>~.select(Nation=="Russia").Medal) /用 ">" 符號比較中俄的獎牌數集合大小,會按順序依次比較金牌、銀牌和銅牌數量,並選出中國排名更高的屆。
5 =A4.(Game) /列出共有哪幾屆

A5的執行結果以下:it

Game
23
25
28
29
30

 

2. 比較兩個集合是否相等

比較兩個集合是否相等是很常見的需求,好比比較文件內容是否相同,比較數據表的數值是否發生變化等。例如比較集合 [1,2,3] 和[2,1,3]是否相等。一般來講,集合的的對位成員不徹底一致,認爲兩個集合是不相等的。可是也有時候並不在乎集合的成員順序,只須要比較兩個集合是否包含了一樣的成員。io

【例 2】 下面是隨機抽樣後生成的文件,比較兩次隨機抽樣是否選出了相同的序號。部分數據以下:table

 

ID Predicted_Y Original_Y
10 0.012388464367608093 0.0
11 0.01519899123978988 0.0
13 0.0007920238885061248 0.0
19 0.0012656367468159102 0.0
21 0.009460545997473379 0.0
23 0.024176791871681664 0.0

【SPL 腳本】class


A B
1 =file("p_old.csv").import@ct() /讀取第一次輸出的文件
2 =file("p_new.csv").import@ct() /讀取第二次輸出的文件
3 =cmp(A1.(ID),A2.(ID)) /使用函數 cmp() 比較兩次生成的 ID 是否徹底相同(成員值相等且順序一致)

A3的執行結果以下:import

Member
0

結果爲 0 表示兩個文件 ID 徹底一致。

    若是 ID 的順序可能不一樣,可使用函數 eq() 比較兩個集合的成員是否相同:


A B
3 =A1.(ID).eq(A2.(ID)) /使用函數 eq() 比較兩次生成的 ID 值是否相同,不要求順序一致。

 

 

3. 集合成員的對位計算

集合成員的對位計算,支持 +,-,*,/,%,\ 等四則運算。例如 3 天內 A 商店的銷售額集合是 [2,3,4],B 商店的銷售額集合是 [3,1,3],咱們但願獲得兩個商店的銷售額之和的集合 [5,4,7]。

【例 3】 求 2019 年 12 月 24 日到 26 日深證 300 (399007) 對深證成指 (399001) 的每日相對收益率。部分數據以下:

 

Date Code Name Open Close Amount
2020/2/18 399001 Shenzhen 11244.7651 11306.4863 3.19E+11
2020/2/17 399001 Shenzhen 10974.9328 11241.4993 3.12E+11
2020/2/14 399001 Shenzhen 10854.4551 10916.3117 2.77E+11
2020/2/13 399001 Shenzhen 10936.5011 10864.3222 2.87E+11
2020/2/12 399001 Shenzhen 10735.0475 10940.7952 2.66E+11

【SPL腳本】


A B
1 =connect("db") /鏈接數據源
2 =["399007","399001"].(A1.query("select   * from StockIndex where code=? and date between'2019-12-23'and  '2019-12-26'",~)) /讀取深證 300 和深證成指在 2019 年 12 月 23 日到 26 日的數據,取 23 日是爲了計算漲幅
3 =A2.(~.calc(to(2,4),Close/Close[-1])) /分別計算 24 到 26 日天天的漲幅
4 =A3(1)--A3(2) /使用符號 "--" 將兩個集合對位相減,便是相對收益率。符號??(?∈{+,-,*,/,%,\})用於兩個集合中成員的對位計算。

A4的執行結果以下:

Member
0.0031349096521252617
0.0011897141619391371
-4.4910504685946595E-4
相關文章
相關標籤/搜索