计算笔记本

2020年11月18日

计算笔记本是一个用于编写散文文档的环境,允许作者嵌入代码,这些代码可以轻松执行,结果也可以轻松地合并到文档中。它是一个特别适合数据科学工作的平台。此类环境包括 Jupyter Notebook、R Markdown、Mathematica 和 Emacs 的 org-mode。

当我探索一些数据时,将我的笔记与执行探索的代码放在一起非常有用。我喜欢尝试一些代码,查看结果,并记下我对该执行的任何观察结果。计算笔记本允许我将这些内容轻松地组合到单个文档中。

以下是一个示例,它展示了对 martinfowler.com 的 Google Analytics 数据进行的一些分析。我在 R Studio 中执行此操作,它使用 R Markdown 格式。

此处的示例是一个图表,因为笔记本非常适合绘制各种图表。但将各种数据操作嵌入代码并在文档中以表格形式显示数据同样有用。

我第一次在 1980 年代后期遇到计算笔记本,当时是使用 Mathematica。我记得希望在我大学期间能够使用这样的工具,但直到最近几年,随着数据科学领域对其使用的增加,我才再次使用计算笔记本。我听到最多的是 Jupyter Notebook,它在 Python 社区很受欢迎,但由于我使用 R 进行数据整理,因此我倾向于使用 R Markdown,通常是在 R Studio 中。我还使用一个更小众的笔记本,org-mode,它是 Emacs 的一部分。

嵌入 Mathematica 的代码是其自己的编程语言,专为表达数学而设计。虽然 Jupyter 起源于 Python 世界,但它支持多种编程语言,R Markdown 也是如此。Mathematica 是一款商业工具,但 Jupyter 和 R Markdown 是开源的。Jupyter 将其文件存储在 JSON 中,R Markdown 使用 markdown 文件,其中包含一些用于代码块的特殊标记。使用文本格式保存文档允许它们存储在常规版本控制工具中,使用标记语言使差异更容易。使用标记语言允许在其他编辑器中编辑文档,但它们需要具有适合执行代码块的环境。

计算笔记本在探索问题时很有用,例如尝试对数据集进行各种形式的分析。该文档充当对已尝试内容以及研究人员在尝试事物时所做的所有观察结果的记录。通过将代码和结果放在一起,编写者可以准确地看到他们做了什么以及产生了什么结果。这种代码和结果的耦合是一种形式的 说明性编程,使该环境对非专业程序员具有吸引力。然而,需要注意的一点是,如果任何外部环境因素改变了结果,例如数据库的内容。如果数据集不太大,可以将其导出并保存在版本控制系统中,但通常其大小会很大。

笔记本也适用于准备报告,通常是通过生成 PDF、HTML 或其他格式的文档。如果我想向作者报告其文章的流量,我会获取最新的报告,更改主题 URL,重新运行所有代码,并调整我认为合适的任何散文评论。如果我足够积极,我可以每隔几个月自动生成此类报告。我喜欢这样的报告可以轻松地包含用于生成结果的代码,以便读者可以准确地理解他们看到的数字背后的逻辑。

但是,笔记本不应该用作生产系统的组件。 笔记本结构 - 具有其随意混合的 IO、计算和 UI - 的目的是鼓励交互性,但不利于作为更广泛代码库一部分的代码所需的模块化。最好将笔记本视为探索逻辑的一种方式,一旦找到路径,该逻辑应复制到专为生产使用而设计的库中。