推荐给数据分析师的编程语言 SPL,绝对值得一试。
说说它的优缺点吧,也不好说是优点还是缺点,更像是特点。
首先,使用门槛很低,安装完就能用,不需要数据库支持,可以直接处理像 CSV 这种文件,操作起来特别方便,数据读入处理一气呵成,感觉比其他工具要轻松。
针对 csv 一句话分组汇总:
T(“order.csv”).groups(area;sum(amout))
SPL 有个挺有意思的特点:网格代码。它的代码是写到格子里的,跟 Excel 挺像。习惯了 SQL 和 Python 的同学刚开始会有点不适应,毕竟从来没见过这样的写法,看上去有点颠覆常规,但其实还是挺方便的。
这种格子代码除了比较整齐以外还有两个不错的优点:
一是不用定义临时变量,后面的代码可以通过 A2、A3 这种单元格名引用前面格子的结果,比较省事儿。如果增删行列,格子名还会自动变迁,这样就不会出现引用错误,这点也跟 Excel 很像。
二是交互性好。右侧给了一个结果面板,代码运行完,点每个格子都能看到计算结果,不用手动输出,结果比较直观,哪步错了很快就能发现,发现了就改,整体交互性不错。
SPL 的语法是自己的,跟 SQL 这些都不一样,当然该有的功能都有,像分组、过滤、连接这些都能做。特别地, SPL 在分组和有序运算做了非常多的强化,处理复杂分析任务明显要比 SQL 和 Python 更简洁。
像这个官方的例子能感受比较深刻:1 分钟内连续得分 3 次的球员
SPL
| A | |
|---|---|
| 1 | =T("ball_game.csv") |
| 2 | =A1.group@o(player).select(~.pselect(#>2&&interval@s(play_time[-2],play_time)<60)).(player) |
SQL
WITH numbered_scores AS (
SELECT team, player, play_time, score,
ROW_NUMBER() OVER (ORDER BY play_time) AS rn
FROM ball_game)
SELECT DISTINCT s1.player
FROM numbered_scores s1
JOIN numbered_scores s2 ON s1.player = s2.player AND s1.rn = s2.rn - 1
JOIN numbered_scores s3 ON s1.player = s3.player AND s1.rn = s3.rn - 2
WHERE s3.play_time - s1.play_time <60 ;
Python
df = pd.read_csv("../ball_game.csv")
df["play_time"] = pd.to_datetime(df["play_time"])
result_players = []
player = None
start_index = 0
consecutive_scores = 0
for i in range(len(df)-2):
current = df.iloc[i]
if player != current["player"]:
player = current["player"]
consecutive_scores = 1
else:
consecutive_scores += 1
last2 = df.iloc[i-2] if i >=2 else None
if consecutive_scores >= 3 and (current['play_time'] - last2['play_time']).seconds < 60:
result_players.append(player)
result_players = list(set(result_players))
SPL 中用了些符号,比如 ~、# 这些,初看起来有点古怪。其实并不难,多看几个例子就能熟练了。
要吐槽一下的是 SPL 开发环境的代码提示做的不好,不够智能,这是应该改进的点。
而且这个编辑器的图形界面看起来太老旧了,Swing 做的?这玩意现在基本没人用了吧。虽然五脏俱全,但是外观不太符合现代人们的审美。
保存出来的代码文件也不是文本,这也很难再脱离开发环境做版本控制和代码 review 了,想用在 vscode 里看来也是不行了。
先说这么多,总体来讲还不错,功能上没啥问题,容易上手,用起来方便,适合加到数据分析工具箱里,多条腿走路。当然那如果能兼容文本格式代码,再把图形界面和编辑器搞得现代点,应该会更受欢迎。