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