ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

有序集合间的对位运算

2020-10-15 13:50:58  阅读:186  来源: 互联网

标签:26 对位 运算 ID 有序 集合 排名 比较


有序集合间的对位运算,包括比较运算(>,<, 等于)和四则运算(+,-,*,/,%,\)。本问中讨论的集合,都是有序集合,有序集合的成员是有次序的。有序集合间的对位运算,会按照顺序使用对位成员进行比较或者四则运算。

1. 比较两个集合的大小

集合可以使用符号 ">" 或 "<" 比较大小,从第一个成员开始按照顺序比较对位成员。例如 [1,3,1] 与[1,2,2]比较大小时,首先比较各自的第一个成员,1 与 1 相等;继续比较各自的第二个成员,因为 3>2,所以 [1,3,1] 大于[1,2,2],无需比较后面的成员了。

【例 1】 以奥运会奖牌榜为例,查询哪几届奥运会中国奖牌榜排名比俄罗斯靠前。部分数据如下:

 

GameNationMedalGame
30USA46,29,2930
30China38,27,2330
30UK29,17,1930
30Russia24,26,3230
30Korea13,8,730

奥运奖牌榜的规则是:首先对比金牌数量,金牌数高的排名靠前,金牌数低的排名靠后,金牌数相同的将会按照银牌数再次对比排名。银牌数高的排名靠前,银牌数低的排名靠后,银牌数相同的将会按照铜牌数再次对比排名。以此类推,铜牌数也相同的国家排名并列。

【SPL 脚本】


AB
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的执行结果如下:

Game
23
25
28
29
30

 

2. 比较两个集合是否相等

比较两个集合是否相等是很常见的需求,比如比较文件内容是否相同,比较数据表的数值是否发生变化等。例如比较集合 [1,2,3] 和[2,1,3]是否相等。通常来说,集合的的对位成员不完全一致,认为两个集合是不相等的。但是也有时候并不在意集合的成员顺序,只需要比较两个集合是否包含了同样的成员。

【例 2】 下面是随机抽样后生成的文件,比较两次随机抽样是否选出了相同的序号。部分数据如下:

 

IDPredicted_YOriginal_Y
100.0123884643676080930.0
110.015198991239789880.0
130.00079202388850612480.0
190.00126563674681591020.0
210.0094605459974733790.0
230.0241767918716816640.0

【SPL 脚本】


AB
1=file("p_old.csv").import@ct()/读取第一次输出的文件
2=file("p_new.csv").import@ct()/读取第二次输出的文件
3=cmp(A1.(ID),A2.(ID))/使用函数 cmp() 比较两次生成的 ID 是否完全相同(成员值相等且顺序一致)

A3的执行结果如下:

Member
0

结果为 0 表示两个文件 ID 完全一致。

    如果 ID 的顺序可能不同,可以使用函数 eq() 比较两个集合的成员是否相同:


AB
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) 的每日相对收益率。部分数据如下:

 

DateCodeNameOpenCloseAmount
2020/2/18399001Shenzhen11244.765111306.48633.19E+11
2020/2/17399001Shenzhen10974.932811241.49933.12E+11
2020/2/14399001Shenzhen10854.455110916.31172.77E+11
2020/2/13399001Shenzhen10936.501110864.32222.87E+11
2020/2/12399001Shenzhen10735.047510940.79522.66E+11

【SPL脚本】


AB
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


标签:26,对位,运算,ID,有序,集合,排名,比较
来源: https://blog.51cto.com/12749034/2541874

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有