Limboy

通过 VisiData 来方便地分析数据

在 Hacker News 上看到一篇 通过 SQLite 来方便地操作 CSV 的文章,利用 sqlite3 对 csv 原生支持的能力,对 csv 执行 SQL 查询,来获得自己想要的数据。试了下确实挺方便的:

保存为一个 bash function 后,就更方便了:

csv2sqlite() {
  sqlite3 :memory: -cmd '.mode csv' -cmd ".import $1.csv $1" -cmd '.mode column' $2
}

# usage
csv2sqlite tweets 'select * from tweets limit 1'

顺便看了下 HN 上的评论,发现有不少人提到了 VisiData 这个工具,就体验了下,确实很不错,能满足常见的数据查询工作,还不用写 SQL。下面就通过 tweets.csv 这个文件,结合具体的场景来看看 VisiData 的使用姿势。

每年发了多少 Tweet

VisiData 安装完后,直接 vd tweets.csv 就可以了,界面如下:

其中有一列为 timestamp,包含了 datetime,我们需要将 Year 分离出来,然后才能进行聚合操作。分离的过程也很简单,先选中 timestamp 这一列,输入快捷键 : 就会进入到正则切分模式,输入空格 ,就可以将 datetime 分开了,然后再对 date 列执行同样的操作,不过要用 - 来切分,这样就能得到 Year 了。

接下来,在 Year 对应的列,按一下 F (shift+f),就能达到 group by 的效果,这个真的太方便了。

可以看到我最爱唠叨的年份是 2008 和 2010 年,那时 Twitter 还能正常访问,有点什么想法就想发一下,也能在 Twitter 上找到很多有意思的人。

也可以通过这个方法看发推频率最高的是那几天:

或者看自己 @ 频率最高的是哪些人:(这里显示的是 user_id,可以通过 user_id 转 username 的服务来看对应的人)

某一天发了哪些推

找到了发推最多的日子后,接下来很自然就想看看这几天自己都发了些啥,比如我想看 2008-01-16 这一天的推,先选择日期列,然后输入快捷键 |,表示要选择符合正则表达式的行,此时 status bar 会提示输入正则,输入 2008-01-16 后回车,就能选中这些行了。

如果 text 列的内容没有完全显示出来,可以选中 text 列,输入快捷键 _ 就行了。

图形化显示每个月的发推数量

VisiData 还支持散点图,我们可以通过这个功能来看每个月的发推数量,不过显示的效果不太好。

好在 VisiData 可以将当前 Table 的内容导出为 csv, json 等常用格式,我们可以将这些数据导入到其他的 plot 服务来获得更好的显示效果。

小结

VisiData 是一个开源项目,有 5 年多的历史了,还在持续维护着,可信任程度还是比较高的。以上是我的简单探索,已经可以满足不少需求了。一开始我对 TUI (Terminal UI) 是有点抗拒的,感觉不如 GUI 美观,但结合 Terminal 的操作确实太方便了,之后如果有不太复杂的数据分析需求,应该还会选择 VisiData。