工夫序列数据的计算脚本须具备较强的有序计算能力,本文从此类工具中精心筛选了三种,从开发效率、语法表达能力、结构化函数库等方面进行深度比照,考查了各脚本在序号计算、绝对地位计算、有序汇合计算等重点运算上的体现,esProc 在这几款工具中的体现最为杰出。点击适宜工夫序列数据的计算脚本理解详情。
工夫序列数据在这里指按工夫排序的日常业务数据。对工夫序列数据进行计算时,不仅波及季度、月份、工作日、周末等惯例计算,还常常遇到较为简单的有序运算,这就要求脚本语言应具备相应的计算能力。个别用于解决工夫序列数据的计算脚本有 SQL、Python Pandas、esProc,上面就让咱们深刻理解这些脚本,看看它们的能力差异。
SQL
SQL 历史悠久用户泛滥,在其模型框架内早已倒退到极限,简直每种简略运算都能找到对应的 SQL 解法,这其中就包含有序运算。
比方比上期的例子:表 stock1001 存储某支股票的交易信息,次要字段有交易日期 transDate、收盘价 price,请计算每个交易日与上个交易日相比收盘价的增长率。
这个例子属于绝对地位计算,如果应用窗口函数,SQL 写法绝对容易:
但有些 SQL 不反对窗口函数,实现比上期就会麻烦得多:
上述代码之所以麻烦,首先是因为 SQL 是基于无序汇合的,自身没有序号,不不便进行有序运算,为了实现有序运算,就要为无序汇合硬造出序号列,这个过程须要自关联和分组汇总,代码比较复杂。其次,比上期属于绝对地位计算,如果 SQL 有绝对序号,这种计算会简略许多,但 SQL 没有绝对序号,只能将上一行关联到本行,变相实现相邻地位计算,代码因而变得复杂。
基于无序汇合的 SQL 不不便实现有序运算,窗口函数尽管能够缓解这一情况,但如果运算再简单时,也仍然麻烦。
比方中位数的例子:scores 表存储学生问题,次要字段有学生编号 studentdid、数学问题 math,请计算数学问题的中位数。中位数的定义是:如果记录总数 L 为偶数,则返回两头两个值的均值(序号别离为 L / 2 和 L /2+1);如果 L 为奇数,则返回惟一的两头值(序号为 (L+1)/2)。
SQL 计算中位数的代码:
能够看到,尽管曾经应用了窗口函数,但 SQL 依然很简单。生成序号的过程对于有序汇合来说是多余的,但对 SQL 来说就是必不可少的步骤,尤其是本例这种必须显式应用序号的状况,这让代码显得简单。SQL 实现分支判断也较麻烦,所以对 L 为奇数的状况进行解决时,并没有返回惟一的两头值,而是两个同样的两头值求均匀,这个技巧尽管能够简化分支判断,但了解起来稍有艰难。
如果应用取整函数,则能够奇妙地跳过判断过程,在简化代码的同时计算出中位数。但这种技巧与中位数的原始定义不同,会造成了解艰难,这里没有采纳。
再看一个稍简单的例子:间断上涨天数。库表 AAPL 存储某支股票的股价信息,次要字段有交易日期 transDate、收盘价 price,请计算该股票最长的间断上涨天数。SQL 如下:
按天然思路实现这个工作时,应答日期有序的股票记录进行循环,如果本条记录与上一条记录相比是上涨的,则将间断上涨天数(初始为 0)加 1,如果是上涨的,则将间断上涨天数和以后最大间断上涨天数(初始为 0)相比,选出新的以后最大间断上涨天数,再将间断上涨天数清 0。如此循环直到完结,以后最大间断上涨天数即最终的最大间断上涨天数。
但 SQL 不善于有序计算,无奈用上述天然思路实现,只能用一些难懂的技巧。把按日期有序的股票记录分成若干组,间断上涨的记录分成同一组,也就是说,某天的股价比上一天是上涨的,则和上一天记录分到同一组,如果上涨了,则开始一个新组。最初看所有分组中最大的成员数量,也就是最多间断上涨的天数。
对于这两个稍简单的有序运算例子,SQL 实现起来就曾经很艰难了,一旦遇到更简单的运算,SQL 简直无奈实现。之所以呈现这种后果,是因为 SQL 的实践根底就是无序汇合,这种人造缺点无论怎样打补丁,都无奈从根本上解决问题。
Python Pandas
Pandas 是 Python 的结构化计算库,常被用作工夫序列数据的计算脚本。
作为结构化计算函数库,Pandas 能够轻松实现简略的有序计算。比方,同样计算比上期,Pandas 代码是这样的:
上述前两句是为了从文件读取数据,外围代码仅有一句。须要留神的是,Pandas 并不能示意前一行,从而间接实现绝对地位计算,但能够用 shift(1) 函数将列整体下移一行,从而变相实现绝对地位计算。代码中行和列、前一行和下一行看上去很像,初学者容易混同。
作为古代程序语言,Pandas 在有序计算方面要比 SQL 先进,次要体现在 Pandas 基于有序汇合构建,dataFrame 数据类型天生具备序号,适宜进行有序计算。后面那些稍简单的有序计算,用 SQL 会十分艰难,用 Pandas 就绝对容易。
同样计算中位数,Pandas 外围代码如下:
上述代码中,Pandas 能够间接用 \[N\] 示意序号,而不必额定制作序号,代码因而失去简化。其次,Pandas 是过程性语言,分支判断比 SQL 易于了解,也不须要技巧来简化代码。
同样稍简单的例子最长间断上涨天数,Pandas 也比 SQL 容易实现。外围代码如下:
本例中,Pandas 能够依照天然思路实现,而不用采取难懂的技巧,代码的表白效率要比 SQL 高得多。
有点遗憾的是,有序计算经常要波及绝对地位计算,但 Pandas 不能间接表白绝对地位,只能把列下移一行来变相示意本行的上一行,了解时有点艰难。
Pandas 在有序计算方面确实比 SQL 容易些,但遇到更简单的状况,Pandas 也会变得很繁琐,下面试举两例。
比方过滤累计值的例子:表 sales 存储客户的销售额数据,次要字段有客户 client、销售额 amount,请找出销售额累计占到一半的前 n 个大客户,并按销售额从大到小排序。Pandas 代码如下:
再比方计算股价最高 3 天的涨幅:表 stock1001 存储某支股票的每日股价,次要字段有交易日期 transDate、收盘价 price,请将股价最高的三天按逆序排列,计算每一天相比前一天的涨幅。Pandas 代码如下:
这些更简单的例子也须要用到一些难懂的技巧去实现,不仅难以编写,而且难以读懂,这里就不再具体解释。
esProc
与 Pandas 相似,esProc 也具备丰盛的结构化计算函数,与 Pandas 不同的是,esProc 除了基于有序汇合并反对序号机制外,还提供了不便的相邻援用机制,以及丰盛的地位函数,从而快捷不便地实现有序计算。
对于简略的有序计算,esProc 和其余计算脚本一样,都能够轻松实现。比方同样比上期的 esProc 代码:
下面代码 A1 从 csv 文件取数,A2 是外围代码。esProc 能够用直观易懂的 \[-1\] 示意绝对本行的前一行,这是 Pandas 和 SQL 都没有的性能,也是 esProc 更为业余的体现。
同样计算中位数,esProc 外围代码如下:
上述代码中,esProc 能够间接用 \[N\] 示意序号,而不必额定制作序号,代码更为简洁。esProc 同样是过程性语法,既能够用 if/else 语句实现大段的分支,也能够像本例一样,用 if 函数实现简洁的判断。
同样稍简单的例子最长间断上涨天数,esProc 也比 SQL/Pandas 容易实现。外围代码如下:
本例中,esProc 能够依照天然思路实现,而不用采取非凡的技巧,代码表白效率要比 SQL 更高。除此外,esProc 既能够用循环语句实现大段的循环,也能够像本例一样,用循环函数 max 实现简洁的循环聚合。
esProc 是更为业余的结构化计算语言,即便遇到更简单的有序计算,也能较为轻松地实现。
比方过滤累计值的例子,esProc 只需如下代码:
本例按天然思维实现,先在 A2 计算出从最大的客户到每个客户的累计值,再在 A3 算出最大累计值的一半,在 A4 算出累计值大于 A3 的地位,最初按地位取数据就是所需后果。这里有体现 esProc 专业性的两处特色,其一是 A3 中的 m 函数,该函数能够逆序取数,- 1 示意倒数第一条;其二是 A4 中的 pselect,能够按条件返回序号。这两种函数都能够无效简化有序计算。
再比方计算股价最高那 3 天的涨幅,esProc 只需如下代码:
上述代码中,A2 中的 ptop 示意前 N 条的地位,和后面的 pselect 相似,返回的不是记录的汇合,而是序号的汇合,相似这样的函数在 esProc 中还有很多,其目标都是简化有序计算。A4 中的 #也是 esProc 的特色,间接示意序号字段,应用起来十分不便,不用像 SQL 那样额定制作,或 Pandas 那样设定 index。
通过比拟咱们能够发现,esProc 具备丰盛的结构化函数,是业余的结构化计算语言,能够轻松实现常见的有序计算,即便更简单的计算也能无效简化,是更加现实的工夫序列数据计算脚本。