Paul Romer,一位62岁的经济学家,与 William Dawbney Nordhaus 共同获得
2018
年度诺贝尔经济学奖。然而除了他作为经济学领域专家的这些身份,也许最值得注意的是,他还是一位
Python
编程语言的使用者。

转自:https://mp.weixin.qq.com/s/583DUcqumWeuEuh3Efy-XA

在数据分析的道路上,你一定曾有过为新发现而激动不已的时刻,此时你急于将自己的发现告诉大家,却遇到了这样的问题:如何将我的分析过程清晰地表述出来呢?

经济学涉及到大量的数学和统计学。最常用的数字工具是电子表格软件 Microsoft
Excel 以及编程语言 Stata 和
Mathematica。它们都是世界各地经济学课堂中常用的工具,不过这三个软件都是专有和私有的。

在本博文里我们会着眼于Jupyter项目回答下面三个问题:
1.为什么这个项目会存在?也就是说,我们的动机、目标和愿景是什么?

为了能与同行们有效沟通,你需要重现整个分析过程,并将说明文字、代码、图表、公式、结论都整合在一个文档中。显然传统的文本编辑工具并不能满足这一需求,所以这儿隆重推荐一款神器
Jupyter
Notebook,不仅能在文档中执行代码,还能以网页形式分享。

Romer
坚信科学研究应该透明。他认为,研究方法的开放性和清晰性对于科学研究获得信任非常重要。正如他在2018年4月的一篇博客文章中解释的那样,为了使自己的工作变得透明,他试图用
Mathematica
分享他的一项研究,任何人都可以探索他的数据和方法中的每一个细节,但
Mathematica 做不到。他表示 Mathematica 的开发商 Wolfram Research
让他们以一种不需要其他人使用专有软件的方式分享他的作品太难了。读者也看不到他用于方程式的所有代码。

  1. 我们是如何发展到现在的状态的?
  2. 从Jupyter自身和它所处的数据和计算的大环境看,接下去它会关注于什么事情?
    Jupyter项目旨在提供一套开源工具的生态系统来方便交互式计算和数据分析。在此分析中,人直接参与到计算的循环(通过执行代码来理解一个问题,并迭代式地改进他们的方法)是Jupyter项目最主要的考虑。
    围绕人来定位Jupyter是整个项目的关键。这帮我们在某些方向上限定了范围(例如,我们不会开发一个通用的图形用户界面框架),同时在其他方面进行了泛化(例如,我们的工具是编程语言独立的,尽管我们团队有非常强的Python背景)。为了满足这一目标,我们:
  3. 试图去获取人在使用计算机去理解和推断数据、模型和算法过程中的本质,并为此来探索想法和开发公开的标准。比如,这就是Jupyter消息协议和notebook文件格式为了它们所针对的问题所提供的功能。
  4. 开发构建能支持一个生态系统发展的库。在这里的工具可以很好地交互,而不用每个人自己再去“造轮子”。例子包括创建新的Jupyter
    kernel(执行用户代码的组件)的工具,或者把notebook转化成其他文件格式的工具。
  5. 开发终端用户应用程序,将这些想法应用于科研、教育和工业界中反复重现的日常工作流程。这是一系列的工具,包括从现在值得尊重的IPython命令行shell(其正在不断发展和改进中)以及我们广泛使用的Jupyter
    Notebook,到诸如为机构准备的JupyterHub等新型工具,以及我们下一代JupyterLab模块化和可扩展接口。
    我们努力构建高可用性、非常高质量的应用程序,但我们更专注于具体的使用模式:例如,JupyterLab的架构主要针对Web-first方法进行了优化,而目前我们生态系统中的其他项目则针对个人计算机桌面使用,如开源的nteract客户端或在商业化的PyCharm
    IDE中支持Jupyter Notebook文件。
  6. 提供一些服务来方便Jupyter工具的采用和使用。例子包括NBViewer,我们的一个在线notebook文件共享系统,以及一个免费的演示服务:try.jupyter.org。
    这些服务本身是完全开源的,使其他人可以在自己的环境中部署它们,也可以基于它们构建新技术,例如这个mybinder.org系统。该系统提供一键式部署的GitHub存储库,用来存放自己的代码、数据和notebook文件。以及这个GitHub上的Jupyter
    Notebook文件的原始渲染器。
    一路走来的一些关键点
    这里不是要做一个详细的历史回顾展。相反,我们将重点介绍一些里程碑,它们展示了与现在继续相关的一系列重要的观点是如何产生的。
    交互式的****Python****和科学****Python****生态系统。Jupyter是从IPython项目演变而来的,专注于使用Python进行交互式计算来应对科学计算的需求和工作流程。从2001年开始,IPython就在道义上承诺构建一个完全开源的项目(从而让研究结果可以无障碍地被共享),并且认识到Python的特性可以使其成为学术界中那些收费的计算软件的挑战者。这意味着IPython会与科学Python生态系统一起成长,为使用NumPy、SciPy、Matplotlib、pandas和其他功能强大的工具包提供“入口”。因此从一开始,我们发现了一个很好的分工:IPython可以专注于人机交互的问题,而由其他项目提供数据结构、算法和可视化等。各种项目通过一个共同的许可证结构自由共享代码,使每个项目能够增加自己的内容的同时,一起为最终的终端用户创建强大的系统而提供各种工具。
    开放的****IPython
    Notebook****协议和文件格式。
    2010年左右,在为IPython构建notebook进行了多次实验后,我们朝着今天所建立的架构迈出了第一步。
    我们希望保留“IPython体验”的设计,这意味着IPython终端的所有特性和工作流都会被保留,但它将通过网络协议进行操作,以便不管客户端在哪里,它都可以连接到提供计算的服务器。使用ZeroMQ网络库,我们定义了一个协议来捕获我们在IPython中熟悉的所有操作,从执行代码到自动补充完成对象的名称(内省操作)。这一决定,在随后的一年多一点的时间里,带来了在2011年夏季发布的图形客户端(仍然使用的Qt控制台)和Jupyter
    Notebook(那个时候的名子还叫IPython)的第一个迭代(更多的细节可以在这篇博文中找到)。
    从****IPython****到****Jupyter****。 IPython
    Notebook被SciPy社区迅速采用,但很快大家就很清楚地发现它的底层架构可以用于任何交互式的编程语言。随后在很短的时间内,除Python之外的其他语言(Julia、Haskell、R等)的内核就被连续地创建了出来。我们自己开发了一些,但大多数内核都是由这些语言的用户独立开发的。这种跨语言的使用场景迫使我们去仔细地验证我们的架构,以消除它对IPython的任何意外依赖。并且在2014年,这也导致我们将该项目的大部分重命名为Jupyter。这个名字的灵感来自Julia、Python和R(数据科学的三种开源语言),但这个名字代表了超越了任何特定语言的通用思想:即计算、数据和人类的理解、共享和协作的活动。
    从****今天的观点来看趋势
    把Juypter带到这一步的这些想法已经编织成更大的计算和数据科学的框架,我们预计它未来将会产生重大影响。以下是我们在Jupyter生态系统中看到的六个趋势:
    1.**
    交互式计算已经是一件真实正经的事情。面向数据的计算已经向更多的从业者展示了交互式计算的想法。科学计算领域的人们已经通过Matlab、IDL和Mathematica等程序语言熟悉了这种人机交互式的计算。然而,当我们在二十世纪初期开始开发IPython时,这种工作流程对于传统软件工程领域的开发人员而言还是很陌生的。诸如Python和Ruby之类的语言提供了交互式的shell,但它们的功能有限,只是轻量级的实验项目,而不是首选的开发环境。当IPython的第一个版本在2001年出现时,它就试图使Python的交互式计算对于那些全职用Python的人来说是愉快的。诸如Jupyter、RStudio、Zeppelin和Databricks等工具已经进一步推动了基于Web的交互式计算。从而使数百万统计学家、数据科学家、数据工程师和人工智能/机器学习人员每天都在进行交互式计算。传统的集成开发环境(IDE)正在被交互式计算环境所取代:Jupyter、JupyterLab和RStudio是这一趋势的杰出例子。与交互式计算共同发展的是基础模块的形式化、被识别和开发出来:内核(运行代码的进程)、网络协议(正式的消息规范来发送代码到内核并获得结果)、用户界面(提供与内核的人机接口)和基于MIME的输出(除简单文本之外的任何类型的结果的表示)等。
    2.

    计算型叙述被广泛地创造出来。实时运行的代码、叙事性的文本和可视化被整合在一起,方便使用代码和数据来讲述故事。在书籍、博文、同行评审的学术出版物、数据驱动的新闻等不同用户和业务场景下,这种计算型叙述正在被用于制作和分享技术内容。诸如Jupyter
    Notebook和R
    Markdown等文件格式将这些计算型叙述编码成可共享和可重现的单位。然而,计算型叙述的实践已经远远超出了这些开源的格式,扩展到许多交互式的计算平台。
    3.

    为具体的洞察编程而不是泛化的任务。计算机科学的总体目标是泛化和抽象。软件工程专注于为多种问题设计统一的库和应用。随着交互式计算作为一种实践的兴起,并将这一过程纳入计算型叙述(我们称之为Literate
    Computing),我们现在有一个新的人群,他们使用编程语言和开发工具的目的不一样了。他们通常为非常具体的目的来探索数据、模型和算法,甚至可能在单个数据集上花费巨大的努力,但会提出复杂的问题并找到可以共享、发表和扩展的见解。由于数据普遍存在于各个学科领域,这表示编程语言和工具的受众群体会极具扩张,但是这些受众的需求和兴趣与“传统”的软件工程师的需求是不同。
    4.

    拥抱多种语言的个人和组织。在处理数据时,许多个人和组织认识到利用多种编程语言优点的好处。在一个以数据为重点的研究组或公司中,看到Python、R、Java和Scala都被使用的情况并不少见。这迫使大家开发和构建协议(Jupyter消息规范)、文件格式(Jupyter
    Notebook、Feature、Parquet、Markdown、SQL、JSON)和用户界面(Jupyter和nteract)等这些可以跨语言统一运行并最大化互操作性和协作的工具。
    5.

    交互式计算的开放标准。十年前的业界重点是为互联网创建开放的标准,如HTML、HTTP及其相应的设备。今天,我们看到为交互式的、面向数据的计算开发的相同类型的标准。Jupyter
    Notebook文件格式是用于计算型叙述的JSON文档格式的正式规范。Markdown是叙事文本的标准(虽然是有点狡猾)。Jupyter消息规范是允许任何交互式计算客户端与任何语言内核通信的开放标准。Vega和Vega-Lite是用于交互式可视化的JSON模式。这些开放标准使得大量的工具和语言可以无缝地协同工作。
    6.

    有意义的共享数据。**政府和组织的开放数据计划为普通人和机构提供了丰富的数据来源。这些数据可被用于探索、再现之前的实验和研究,以及为别人构造服务。但是数据只有在配合正确的工具(Jupyter、nteract、RStudio、Zeppelin等)后才有意义,才能让用户可以探索这些数据集并分享其结果,能将把数据分析过程人性化,能支持协作,以及能用叙述性内容和可视化来展现数据的意思。
    那么接下来的问题就是:所有这些趋势是否意味着一种更大的模式?我们认为它们都预示着为了优化人机交互和理解所进行的计算的代码、数据和用户界面的出现和发展。
    过去,人类不得约束自己以适应计算机的各种限制(网络、内存、CPU、磁盘空间等)。现在这些先前的约束已经显著地得到了放松,我们可以享受使用高级语言(Python、R、Julia)和丰富的网络接口(Web浏览器和JavaScript框架)。我们可以使用精心设计的基于浏览器的用户界面构建出强大的分布式系统,使我们能够使用计算资源和数据,而不管它们所在的地理位置是哪里。我们现在可以开始优化我们最重要的资源:人的时间。
    先前这些的约束放松并没有神奇地触发以人为本的计算系统的创造,但是打开了它的大门。真正的动力可能是每个可以想像得到的组织和活动里出现的数据的爆炸式增长。这使人们深刻地需要以更重要和有意义的方式与代码和数据进行交互。如果没有这个动力,Jupyter项目也依然会存在,但它可能只会局限在非常小范围的学术科学计算社区里。
    组织机构需要在制定数据战略时开始关注人的因素。Jupyter能在一些机构中取得的巨大成功并不是高层管理人员做出的购买决定。它是那些每天都要必须花时间纠结于编码和数据的开发人员和数据科学家自己的决定。在未来,把人的因素放到前沿和中心,并把设计和可用性与性能一样优先考虑的工具和系统才将会被实际使用和广泛采用。我们开发了Jupyter的思路是因为我们自己想使用它,而我们将基于这些想法继续前进。
    致谢
    在此,我们无法一一感谢所有那些让Jupyter成为可能的人,但是我们想统一感谢你们所有人:用户、开发人员和与我们互动的许多社区在线论坛和活动的参与者。无论您是高中教师、音乐学家、癌症研究员,还是为公司构建数据科学工具的开发人员,这个项目首先并会继续服务于一个公开分享的想法、工具和素材的世界。从我们的长期开发人员到把这一工具带给你的新同事的人员,感谢你们参与这个项目。
    如果没有下述慷慨支持我们的机构,Jupyter是不可能的存在的:Alfred P.
    Sloan基金会、Gordon和Betty
    Moore基金会、Helmsley慈善信托基金会和Simons基金会。最后,我们要感谢为项目提供资金、资源和开发工作的行业合作伙伴:Bloomberg、Continuum
    Analytics、Enthought、Google、IBM、MaxPoint
    Interactive、Microsoft、Netflix和Rackspace。
    我们要感谢Jamie Whitacre和Lisa Mann对这篇文章所做的宝贵贡献。

    澳门新葡萄京官网首页 1

下图简单展示了Jupyter Notebook 文档的样式,更多示例可在
nbviewer
中找到。

在 Romer 发现很难通过 Mathematica 分享他的研究后,他发现 Jupyter
notebooks
也可以完成这项任务,于是便切换到了使用 Jupyter
notebooks 应用。Jupyter notebooks 是一个 Web
应用程序,支持数十种语言,允许程序员和研究人员共享包含代码、图表、方程式和数据的文档。Romer
使用的是 Python 语言, Python 是数据科学和统计学中最流行的语言。

**Fernando
Pérez**是劳伦斯伯克利国家实验室的科学家,也是加州大学伯克利分校的伯克利数据科学研究所的创始人,这个研究所创始于2013年。他在科罗拉多大学大石城分校获得粒子物理博士学位,随后在应用数学领域进行博士后研究,并开发数值算法。今天,他的研究重点是为跨领域学科创建现代计算研究和数据科学的工具,重点是高级语言、交互和叙述型计算,以及可重复的研究。他在2001年读研期间开发创造了IPython,并在它进入Project
Jupyter项目后继续领导着IPython的逐步演进。现在这个工具在一个有才华的团队的合作努力下继续发展。他定期讲授科学计算和数据科学。他是Python软件基金会的成员,还是NumFOCUS基金会的创始成员,他也是美国国家科学院Kavli
Frontiers科学家成员。他获得了自由软件基金会2012年度免费软件奖。  

![](https://upload-images.jianshu.io/upload_images/5737996-d80c79147534d560)


**Brian Granger**是加州州立理工大学San Luis
Obispo分校的物理学助理教授。他拥有理论原子、分子和光学物理学的背景,以及科罗拉多大学的博士学位。他目前的研究兴趣包括量子计算、并行和分布式计算,以及用于科技计算的交互式计算环境。他是IPython项目的核心开发人员,也是许多其他专注于Python中的科学计算的开源项目的积极贡献者。  
This article originally appeared in English: "The state of Jupyter".

Jupyter Notebook 文档示例

更重要的是,与 Mathematica 不同,Jupyter notebooks
是开源的,这意味着任何人都可以查看和获得它的源代码,从而诞生真正透明的研究。Jupyter
notebooks
还被认为可能会取代传统的
PDF 文档。

本文将按如下内容来展开:

Romer 表示 Jupyter notebooks
对于分享他的研究意义重大,它们支持信息的完整和透明,而专有软件则鼓励保密。Romer
写到:“我越了解专有软件,就越担心客观真相可能会从地球上消失。”

一、Jupyter Notebook 介绍

(文/开源中国)    

  • 文学编程
  • 历史传承
  • 优点

二、Jupyter Notebook 使用入门

  • 安装
  • 运行
  • 界面

三、Jupyter Notebook 进阶功能

  • 数学公式编辑
  • 幻灯片制作
  • 魔术关键字

一、Jupyter Notebook 介绍

文学编程

在介绍 Jupyter Notebook
之前,让我们先来看一个概念:文学编程
( Literate programming ),这是由 Donald Knuth
提出的编程方法。传统的结构化编程,人们需要按计算机的逻辑顺序来编写代码;与此相反,文学编程则可以让人们按照自己的思维逻辑来开发程序。

简单来说,文学编程的读者不是机器,而是人。
我们从写出让机器读懂的代码,过渡到向人们解说如何让机器实现我们的想法,其中除了代码,更多的是叙述性的文字、图表等内容。这么一看,这不正是数据分析人员所需要的编码风格么?不仅要当好一个程序员,还得当好一个作家。那么
Jupyter Notebook 就是不可或缺的一款集编程和写作于一体的效率工具。

历史传承

也许说到 Jupyter 你会觉得陌生,但想必你或多或少听过鼎鼎大名的
IPython。其实Jupyter
脱胎于 IPython 项目,IPython 顾名思义,是专注于 Python
的项目,但随着项目发展壮大,已经不仅仅局限于 Python
这一种编程语言了。Jupyter 的名字就很好地释义了这一发展过程,它是
Julia、Python 以及 R
语言的组合,字形相近于木星(Jupiter),而且现在支持的语言也远超这三种了。

优点

以下列举了 Jupyter Notebook 的众多优点:

  • 极其适合数据分析
    想象一下如下混乱的场景:你在终端中运行程序,可视化结果却显示在另一个窗口中,包含函数和类的脚本存在其他文档中,更可恶的是你还需另外写一份说明文档来解释程序如何执行以及结果如何。此时
    Jupyter Notebook
    从天而降,将所有内容收归一处,你是不是顿觉灵台清明,思路更加清晰了呢?

  • 支持多语言
    也许你习惯使用 R 语言来做数据分析,或者是想用学术界常用的 MATLAB 和
    Mathematica,这些都不成问题,只要安装相对应的核(kernel)即可。这里列出了
    Jupyter 支持的所有语言,供您参考。

  • 分享便捷
    支持以网页的形式分享,GitHub 中天然支持 Notebook 展示,也可以通过
    nbviewer
    分享你的文档。当然也支持导出成 HTML、Markdown 、PDF
    等多种格式的文档。

  • 远程运行
    在任何地点都可以通过网络链接远程服务器来实现运算,这里给出一个远程运行的例子,可以体验一下
    Jupyter Notebook。

  • 交互式展现
    不仅可以输出图片、视频、数学公式,甚至可以呈现一些互动的可视化内容,比如可以缩放的地图或者是可以旋转的三维模型。这就需要交互式插件(Interactive
    widgets)来支持,更多内容请参考这里。


二、Jupyter Notebook 使用入门

安装

对于初学者,最简单的方法是安装 Anaconda,因为它自带了 Jupyter
Notebook。如果想进一步了解 Anaconda
的使用方法,可参考我的上一篇文章《致Python初学者们 –
Anaconda入门使用指南》。

对于有经验的同学,自然使用命令行最为便捷。

如果在 conda 环境中,可以使用如下命令安装:

conda install jupyter notebook

或者直接通过 pip 安装:

pip install jupyter notebook

更多的安装说明请参考官网。

运行

如果使用 Anaconda,可以在其 Navigator 图形界面中点击打开
Notebook。但是最快捷的方法还是在命令行中输入:

jupyter notebook

此时你的 Web 浏览器被自动打开,显示文件目录。通过点击右上角的 new
创建新文档。

进入 notebook

而关闭 notebook 文档可以通过选择文件名前的复选框后,点击 Shutdown
按钮实现。如果要关闭整个服务,则在原来的终端中按 Control + C 两次。

退出 notebook

界面

Notebook 文档是由一系列单元(Cell)构成,主要有两种形式的单元:

  • 代码单元:这里是你编写代码的地方,通过按 Shift + Enter
    运行代码,其结果显示在本单元下方。代码单元左边有 In [1]:
    这样的序列标记,方便人们查看代码的执行次序。

  • Markdown 单元:在这里对文本进行编辑,采用 markdown
    的语法规范,可以设置文本格式、插入链接、图片甚至数学公式。同样使用
    Shift + Enter 运行 markdown 单元来显示格式化的文本。

Jupyter Notebook 编辑界面

类似于 Linux 的 Vim 编辑器,在 notebook 中也有两种模式:

  • 编辑模式:编辑文本和代码。选中单元并按 Enter
    键进入编辑模式,此时单元左侧显示绿色竖线。

  • 命令模式:用于执行键盘输入的快捷命令。通过 Esc
    键进入命令模式,此时单元左侧显示蓝色竖线。

如果要使用快捷键,首先按 Esc
键进入命令模式,然后按相应的键实现对文档的操作。比如切换成代码单元(Y)或
markdown
单元(M),或者在本单元的下方增加一单元(B)。查看所有快捷命令可以按H

尽管一开始需要花费一些学习成本,但熟练使用快捷键将大大提高工作效率。试想你在键盘上十指如飞时,如果还需要通过鼠标来操作文档,是不是很影响思考速度呢?


三、Jupyter Notebook 进阶功能

数学公式编辑

如果你曾做过严肃的学术研究,一定对
LaTeX
并不陌生,这简直是写科研论文的必备工具,不但能实现严格的文档排版,而且能编辑复杂的数学公式。在
Jupyter Notebook 的 markdown 单元中我们也可以使用 LaTeX
的语法来插入数学公式。

在文本行中插入数学公式,使用一对 $符号,比如质能方程
$E = mc^2$。如果要插入一个数学区块,则使用一对 $$
符号。比如下面公式表示 z=x/y:

$$ z = frac{x}{y} $$ 

如何在 notebook 中使用 LaTeX,可进一步参考 A Primer on Using LaTeX in
Jupyter
Notebooks
这篇文章。

幻灯片制作

既然Jupyter Notebook
擅长展示数据分析的过程,除了通过网页形式分享外,当然也可以将其制作成幻灯片的形式。这里有一个幻灯片示例供参考,其制作风格简洁明晰。

那么如何用 Jupyter Notebook 制作幻灯片呢?首先在 notebook 的菜单栏选择
View > Cell Toolbar > Slideshow,这时在文档的每个单元右上角显示了
Slide Type
的选项。通过设置不同的类型,来控制幻灯片的格式。有如下5中类型:

  • Slide:主页面,通过按左右方向键进行切换。
  • Sub-Slide:副页面,通过按上下方向键进行切换。
  • Fragment:一开始是隐藏的,按空格键或方向键后显示,实现动态效果。
  • Skip:在幻灯片中不显示的单元。
  • Notes:作为演讲者的备忘笔记,也不在幻灯片中显示。

Jupyter Notebook 幻灯片设置

当编写好了幻灯片形式的 notebook,如何来演示呢?这时需要使用
nbconvert

jupyter nbconvert notebook.ipynb --to slides --post serve

在命令行中敲入上述代码后,浏览器会自动打开相应的幻灯片。

魔术关键字

魔术关键字(magic keywords),正如其名,是用于控制 notebook
的特殊的命令。它们运行在代码单元中,以 % 或者 %%
开头,前者控制一行,后者控制整个单元。

比如,要得到代码运行的时间,则可以使用 %timeit;如果要在文档中显示
matplotlib 包生成的图形,则使用
% matplotlib inline;如果要做代码调试,则使用
%pdb。但注意这些命令大多是在Python kernel 中适用的,其他 kernel
大多不适用。有许许多多的魔术关键字可以使用,更详细的清单请参考 Built-in
magic
commands


相关资源汇总

本文给出了许多扩展链接供参考,这里汇总如下,供您参考:

  1. Jupyter Notebook
    官网
  2. 文学编程 Literate
    programming
  3. IPython 官网
  4. LaTeX官网
  5. LaTeX 语法:A Primer on Using LaTeX in Jupyter
    Notebooks
  6. 魔术关键字:Built-in magic
    commands
  • 如果你现在迫不及待地想试一试 Jupyter
    Notebook了,请参考系列文章Python数据分析的起手式