集算器 -九游会登陆

集算器是什么

  • 一种面向结构化数据的程序计算语言
  • 集算器又称:spl(structured process language)
  • 敏捷计算是集算器的主要特征
敏捷计算编程语言

结构化数据计算的广泛性

结构化数据计算无处不在

结构化数据计算一直是数据处理的主流

表格数据

数据库

文件数据

web数据

绝大部分日常数据处理都是面向结构化数据的

编程的必要性

分析处理结构化数据的三种方式

bi工具

  • 只能实施规整计算
  • 无法完成数据准备

数据工具

  • 只能处理模式化的计算
  • 无法完成灵活的复杂计算

编程

  • 可以处理所有情况
八成以上数据处理和计算的需求无法用可视化工具完成
编程是处理结构化数据有效的方式,目前仍然是必不可少的方式

为什么是spl

sql的不足

sql作为常使用的结构化数据处理语言存在如下问题

难写难调试

sql不提倡过程,难以实现复杂计算,经常要写得很长,难写难调试

过于封闭

sql强依赖数据库,无法计算文件等库外数据,很难跨库计算

语法问题

sql与spl对比

计算目标:某支股票最长连续涨了多少交易日?
select max(continuousdays)-1
from (select count(*) continuousdays
	from (select sum(changesign) over(order by tradedate) unrisedays
		from (select tradedate,
			case when closeprice>lag(closeprice) over(order by tradedate)
			then 0 else 1 end changesign
		from stock) )
	group by unrisedays)

sql解法

sql在使用窗口函数的情况下嵌套三层完成;

前面读懂了吗?


a
1 =stock.sort(tradedate)
2 =0
3 =a1.max(a2=if(closeprice>closeprice[-1],a2 1,0))

spl解法

其实这个计算很简单,按照自然思维:先按交易日排序(行1),然后比较当天收盘价比前一天高就 1,否则就清零,最后求个最大值(行3)


python的不足

python相对sql更加灵活开放,但仍存在如下问题

难以实现复杂计算

pandas不是专业结构化数据计算包,在处理分组有序等复杂运算时较为繁琐

使用门槛太高

pandas等计算包只有专业程序员才能玩得转

语法问题

python与spl对比

计算目标:计算每年同月份增长比
import time
import numpy as np
import pandas as pd
s = time.time()
sales = pd.read_csv("c:\\users\\sean\\desktop\\kaggle_data\\music_project_data\\sales.csv",sep='\t')
sales['orderdate']=pd.to_datetime(sales['orderdate'])
sales['y']=sales['orderdate'].dt.year
sales['m']=sales['orderdate'].dt.month
sales_g = sales[['y','m','amount']].groupby(by=['y','m'],as_index=false)
amount_df = sales_g.sum().sort_values(['m','y'])
yoy = np.zeros(amount_df.values.shape[0])
yoy=(amount_df['amount']-amount_df['amount'].shift(1))/amount_df['amount'].shift(1)
yoy[amount_df['m'].shift(1)!=amount_df['m']]=np.nan
amount_df['yoy']=yoy
print(amount_df)
e = time.time()
print(e-s)

python解法

python通过多步算出结果,实现起来比sql更容易

但python代码比较繁琐,写出来并不容易


a
1 =file("c:\\sales.csv").import@t()
2 =a1.groups(year(orderdate):y,month(orderdate):m,sum(amount):x)
3 =a2.sort(m)
4 =a3.derive(if(m==m[-1],x/x[-1]-1,null):yoy)

spl解法

spl的分步代码更为简洁,实现更为简单


其他现有编程语言的不足

一些场景下还会使用java、vba实施结构化数据计算

java和vba都不是为结构化数据计算设计的,缺少集合化计算类库,编码过于复杂

相对以上编程语言,
spl才是处理结构化数据简洁有效的编程语言
结构化数据计算神器

简洁易用的开发环境


专门设计的语法体系

spl特别适合复杂过程运算


丰富的运算类库

专门针对结构化数据表设计,类库丰富,远超sql和python


更多对比

spl语言理念

集合化

结构化数据总是批量形式

集合运算库 · lambda语法 · 动态数据结构

sql是集合化的语言,但集合化不够彻底

  • 无法描述集合的集合
  • 字段取值不能再是集合

离散性

集合成员可游离在集合外存在,方便单独引用;独立运算或及其它游离成员再组合新集合运算

sql缺乏离散性

  • 没有天然序号,引用集合指定成员很麻烦
  • 只有单行记录的表,没有游离记录

离散性支持下的集合化

彻底的集合化需要离散性的支持

允许游离成员组成新集合

有序计算是集合化与离散性的结合物

运算不仅与数据本身有关,还和数据所在位置有关


彻底的集合化

显式集合数据类型

  a
1 =人员表.group(生日).select(~.count(1)>1).conj()

集合运算

  a
1 =v.len()
2 =v.to(a1\4 1,a1*3\4).run(value-=v(a1\2).value)

成员再构成集合进行运算

  a b
1 ...
2 =a1.select(height>=1.7) =a1.select(sex=="female")
3 =a2^b2 =a1.select(height>=1.7&&sex=="female")
4 =a2\b2 =a1.select(height>=1.7&&sex!="female")

强lambda语法解决有序运算

本值引用~

  a b
1 ... ...
2 =a1.select(sex=="male") =a1.select(sex=="female")
3 =a2.conj(b2.([a2.~,~])) =a3.minp@a(abs(~(1).height-~(2).height))

序号引用#

  a
1 ...
2 =a1.group((# 2)\3)
3 =a1.group(#%3 1)

相邻成员与集合引用

  a
... ...
3 =a2.derive(price-price[-1]:gain)
4 =a2.derive(price[-1:1].avg():mavg)

举例:返回集合的聚合

计算任务:列出每个用户最近一次登录间隔

with tt as
	(select rank() over(partition by uid order by logtime desc) rk, t.*  from 登录表 t)
select uid,(select tt.logtime from tt where tt.uid=ttt.uid and tt.rk=1)
		-(selet tt.logtim from tt where tt.uid=ttt.uid and tt.rk=2) 间隔
from 登录表 ttt group by uid 

聚合函数返回值不一定是单值,也可以返回一个集合

彻底的集合化后很容易针对分组子集实施返回集合的聚合运算

a
1 =登录表.groups(uid;top(2,-logtime)) 最后2个登录记录
2 =a1.new(uid,#2(1).logtime-#2(2).logtime:间隔) 计算间隔

举例:跨行引用

计算任务:计算每月前后各一个月的销售额移动平均值

with b as
	(select lag(销售额) over (order by 月份) f1, lead(销售额) over (order by 月份) f2,   a.* from 销售表 a)
select 月份,销售额,
	(nvl(f1,0) nvl(f2,0) 销售额)/(decode(f1,nulll,0,1) decode(f2,null,0,1) 1) 移动平均
from b

窗口函数只有简单的跨行引用,涉及集合要用成员去拼

有序集合上可提供跨行集合引用方案

a
1 =销售表.sort(月份).derive(销售额[-1,1].avg()):移动平均)

举例:有序分组

计算任务:一支股票最长连续上涨了多少天

select max(连续日数) from 
	(select count(*) 连续日数 from 
		(select sum(涨跌标志) over ( order by 交易日) 不涨日数 from 
		(select 交易日,
			case when  收盘价>lag(收盘价) over( order by 交易日 then 0 else 1 end 涨跌标志
		from 股票 ))
	group by 不涨日数)

另一种和次序有关的分组,条件成立时产生新组

a
1 =股票.sort(交易日).group@i(收盘价 < 收盘价[-1]).max(~.len())

举例:分组子集与有序分组混合

计算任务:找出连续上涨三天的股票

with a as
     (select 代码,交易日, 收盘价-lag(收盘价) over (paritition by 代码 order by 涨幅) from 股票)
b as
     (select 代码,
          case when 涨幅>0 and
              lag(涨幅) over (partition by 代码 order by 交易日) >0  and
              lag(涨幅,2) over partition by 代码 order by 交易日) >0
              then 1 else 0 end 三天连涨标志  from a)
select distinct 代码 from b where 三天连涨标志=1

分组子集与有序计算的组合

a
1 =股票.sort(交易日).group(代码)
2 =a1.select((a=0,~.pselect(a=if(收盘价>收盘价[-1],a 1,0):3))>0).(代码)

举例:位置利用

计算任务:某股票股价最高的那三天的平均涨幅

select avg(涨幅) from
	( select 交易日, 收盘价-lag(收盘价) over ( order by 交易日) 涨幅 from 股价表
		where 交易日 in
			(select 交易日 from
				(select 交易日, row_number() over(order by 收盘价 desc) 排名 from 股票)
	where 排名<=3 )

无序集合不能利用位置访问相邻成员,计算量增大

有序集合可以提供丰富的按位置访问机制

a
1 =股票.sort(交易日)
2 =a1.calc(a1.ptop(3,-收盘价),收盘价-收盘价[-1]).avg()

离散性支持下的集合运算

过滤、计算列、位置引用、相邻引用、排序/排名、列上的宏运算

分组汇总/分组子集、枚举分组/序号分组、有序分组/条件分组、转置与扩展

集合交并差、归并、外键关联、同维主子关联


合并汇总与拆分

  • 列相同的表格合并
  • 合并时去除重复的列
  • 合并时汇总重复的列
  • 横向拼接列不相同的表
  • 行列方向都合并时去除重复项
  • ……

查找与筛选

  • 查找某个值的位置
  • 使用位置筛选
  • 找到第一个或最后一个
  • 找到最大最小值
  • 选出前n名/后n名
  • ……

格值与汇总值计算

  • 使用相邻行和区间计算
  • 可能提前终止的累计
  • 同类数据连续时使用同类相邻行计算
  • 同类数据不连续时使用同类相邻行计算
  • 使用同类数据的汇总信息
  • …….

集合运算和从属判断

  • 简单成员的交并差
  • 行式数据求交并差
  • 不确定数量的集合求交并差
  • 集合相等与从属判断
  • 次序无关的集合相等与从属判断
  • ……

重复判断、计数与去除

  • 判断是否有与自己重复的数据
  • 统计重复次数
  • 不确定多列一起统计重复次数
  • 行式数据去重
  • 简单数据去重
  • …….

排序与排名

  • 按指定次序对齐排列
  • 指定次序有重复值的对齐
  • 将并列排名的成员拼接起来
  • 在相同分类内排序
  • 分类下的排名
  • ……

特殊分类和汇总方法

  • 每n个成员分成一组
  • 使用相邻数据作为分组条件
  • 碰到空行或非空行时分组
  • 按数据值的间隔分组
  • 将分类内的数据拼接成文字
  • ……

关联与比对

  • 关联表引用
  • 区间关联
  • 二维关联表
  • 使用区间范围倒查关联表
  • 关联多行数据
  • ……

行列转换

  • 固定列的行转列
  • 行式表与交叉表互换
  • 行列的高层分类互转
  • 分类内数据横向拼入列
  • 分类数据拼入列时要再分类或排序
  • ……

扩展与补齐

  • 生成连续的区间
  • 根据数值将一行扩展出多行
  • 拆分文字后扩展成多行
  • 在连续值中补足缺失部分
  • 每隔n行补足若干空行
  • ……

集算器特色功能

excel配合

spl与excel配合可以增强excel计算能力,降低计算实施难度

使用剪贴板


通过spl的excel插件可以在excel中使用spl函数进行计算,也可以在vba中调用spl脚本

excel加载spl插件

excel中使用spl函数实施计算

vba中调用spl脚本完成计算


报表工具配合

spl可以调用报表工具生成、输出报表

1、excel中使用spl函数实施计算

2、spl脚本,调用报表模板

3、根据报表模板样式生成的报表(excel)


大数据计算

spl提供了外存游标、并行计算等机制实现大数据文件计算

python未提供大数据支持,需要手写代码,非常繁琐

计算目标:将大文件按照订单编号排序

部分python代码(共67行)
a b
1 =file(file_path).cursor@tc() /创建大文件游标
2 =a1.sortx(key) /游标排序
3 =file(out_file).export@tc(a2) /结果流式输出到文件
spl通过3行就可以完成大文件排序

文件sql查询

通过spl可以针对文本、excel等文件使用sql进行查询;提供不依赖于数据库的sql查询能力

计算目标:将大文件按照订单编号排序

students_scores.txt
分组汇总
a
1 $select   class,min(english),max(chinese),sum(math) from e:/txt/students_scores.txt group by class
关联查询
a
1 $select   sum(s.quantity*p.price) as totalfrom e:/txt/sales.txt as s   join e:/txt/products.txt as p on s.productid=p.id where s.quantity<=10

更多资料

网站地图