Jupyter Notebook 是一个非常强大的工具,常用于交互式地开发和展示数据科学项目。它将代码和它的输出集成到一个文档中,并且结合了可视的叙述性文本、数学方程和其他丰富的媒体。它直观的工作流促进了迭代和快速的开发,使得 notebook 在当代数据科学、分析和越来越多的科学研究中越来越受欢迎。最重要的是,作为开源项目的一部分,它们是完全免费的。
Jupyter 项目是早期 IPython Notebook 的继承者,它在 2010 年首次作为原型发布。尽管在 Jupyter Notebook 中可以使用许多不同的编程语言,但本文将重点介绍 Python,因为在 Jupyter Notebook 中 python 是最常见的。
为了充分理解本教程,你应该熟悉编程,特别是 Python 和 pandas(译者注:Pandas 是python的一个数据分析包)。也就是说,如果你有编程经验,这篇文章中的 Python 不会太陌生,而 pandas 也是容易理解的。Jupyter Notebooks 也可以作为一个灵活的平台来运行 pandas 甚至是 Python,这将在这篇文章中体现。
我将会:
我们将通过一个样本分析,来回答一个真实的问题,这样你就可以看到一个 notebook 的工作流是如何使任务直观地完成的,当我们分享给其他人时也可以让其他人更好地理解。
假设你是一名数据分析师,你的任务是弄清楚美国最大公司的利润变化历史。你会发现自从 1955 年第一次发表这个名单以来,已有超过 50 年的财富 500 强企业的数据集,这些数据都是从《财富》的公共档案中收集来的。我们已经创建了一个可用数据的 CSV 文件(你可以在这里获取它)。
正如我们将要演示的,Jupyter Notebooks 非常适合这项调查。首先,让我们安装 Jupyter。
初学者开始使用 Jupyter Notebooks 的最简单方法是安装 Anaconda。Anaconda 是最广泛使用的用于数据科学的 Python 发行版,并且预装了所有常用的库和工具。除了 Jupyter 之外,Anaconda 中还封装了一些 Python 库,包括 NumPy,pandas 和 Matplotlib,并且这完整的1000+列表是详尽的。这使你可以在自己完备的数据科学研讨会中运行,而不需要管理无数的安装包或担心依赖项和特定操作系统的安装问题。
安装 Anaconda:
如果你是已经安装了 Python 的更高级的用户,并且更喜欢手动管理你的软件包,那么你可以使用pip:
pip3 install jupyter
在本节中,我们将看到如何运行和保存 notebooks,熟悉它们的结构,并理解接口。我们将会熟悉一些核心术语,这些术语将引导你对如何使用 Jupyter notebooks 进行实际的理解,并为下一节做铺垫,该部分将通过示例数据分析,并将我们在这里学到的所有东西带到生活中。
在 Windows 上,你可以通过将 Anaconda 快捷方式添加到你的开始菜单来运行 Jupyter,它将在你的默认网页浏览器中打开一个新的标签,看起来就像下面的截图一样。
这是 Notebook Dashboard,专门用于管理 Jupyter Notebooks。把它看作是探索,编辑和创建 notebooks 的启动面板。你可以把它看作是探索、编辑和创造你的 notebook 的发射台。
请注意,仪表板将只允许您访问 Jupyter 启动目录中包含的文件和子文件夹;但是,启动目录是可以更改的。还可以通过输入 jupyter notebook
命令在任何系统上启动指示板(或在Unix系统上的终端);在这种情况下,当前工作目录将是启动目录。
聪明的读者可能已经注意到,仪表板的 URL 类似于 http://localhost:8888/tree
。Localhost 不是一个网站,而是表示从你的本地机器(你自己的计算机)中服务的内容。Jupyter notebook 和仪表板都是 web 应用程序,Jupyter 启动了一个本地的 Python 服务器,将这些应用程序提供给你的 web 浏览器,使其从根本上独立于平台,并打开了更容易在 web 上共享的大门。
仪表板的界面大部分是不言自明的 —— 尽管我们稍后会简要介绍它。我们还在等什么?浏览到你想要创建你的第一个 notebook 的文件夹,点击右上角的 New
下拉按钮,选择 Python 3
(或者你喜欢的版本)。
我们马上能看到成果了!你的第一个 Jupyter Notebook 将在新标签页打开 - 每个 notebook 使用它自己的标签,因为你可以同时打开多个 notebook。如果您切换回仪表板,您将看到新文件 Untitled
。你应该看到一些绿色的文字告诉 notebook 正在运行。
理解这个文件到底是什么是很有用的。每一个 .ipynb
文件是一个文本文件,它以一种名为 JSON 的格式描述你的 notebook 的内容。每个单元格及其内容,包括已被转换成文本字符串的图像附件,都与一些元数据一起列出。你可以自己编辑这个 – 如果你知道你在做什么! – 通过在 notebook 的菜单栏中选择 “Edit > Edit Notebook Metadata”。
你还可以通过在仪表板上的控件中选择 Edit
来查看你的 notebook 文件的内容,但是重要的是可以;除了好奇之外没有理由这样做,除非你真的知道你在做什么。
既然你面前有一个打开的 notebook,它的界面就不会看起来完全陌生;毕竟,Jupyter 实际上只是一个高级的文字处理器。为什么不看一看?查看菜单以了解它,尤其是花点时间浏览命令选项板(这是带键盘图标的小按钮(或 Ctrl + Shift + P
))下滚动命令列表。
您应该注意到两个非常重要的术语,这对您来说可能是全新的:单元格和内核。它们是理解 Jupyter 和区分 Jupyter 不只是一个文字处理器的关键。幸运的是,这些概念并不难理解。
稍后我们再讨论内核,在这之前我们先来了解一下单元格。单元格构成一个笔记本的主体。在上面一节的新建的 notebook 屏幕截图中,带有绿色轮廓的盒子是一个空的单元格。我们将介绍两种主要的单元格类型:
新的 notebook 中的第一个单元总是一个代码单元。让我们用一个经典的 hello world 示例来测试它。输入 print('Hello World!')
到单元格中,点击上面工具栏中的 run 按钮,或者按下 Ctrl + Enter 键。结果应该是这样的:
print('Hello World!')
Hello World!
当你运行这个单元格时,它的输出将会显示在它的下面,而它左边的标签将会从 In [ ]
变为 In [1]
。代码单元的输出也是文档的一部分,这就是为什么你可以在本文中看到它的原因。你总是可以区分代码和 Markdown 单元,因为代码单元格在左边有标签,而 Markdown 单元没有。标签的“In”部分仅仅是“输入”的缩写,而标签号表示在内核上执行单元格时的顺序 —— 在这种情况下,单元格被第一个执行。再次运行单元格,标签将更改为 In[2]
,因为此时单元格是在内核上运行的第二个单元格。这让我们在接下来对内核的深入将非常有用。
从菜单栏中,单击插入并选择在下方插入单元格,创建你新的代码单元,并尝试下面的代码,看看会发生什么。你注意到有什么不同吗?
import time
time.sleep(3)
这个单元不产生任何输出,但执行需要 3 秒。请注意,Jupyter 将标签更改为 In[*]
来表示单元格当前正在运行。
一般来说,单元格的输出来自于单元执行过程中指定打印的任何文本数据,以及单元格中最后一行的值,无论是单独变量,函数调用还是其他内容。例如:
def say_hello(recipient):
return 'Hello, {}!'.format(recipient)
say_hello('Tim')
'Hello, Tim!'
你会发现自己经常在自己的项目中使用它,以后我们会看到更多。
在运行单元格时,你可能经常看到它们的边框变成了蓝色,而在编辑的时候它是绿色的。总是有一个“活动”单元格突出显示其当前模式,绿色表示“编辑模式”,蓝色表示“命令模式”。
到目前为止,我们已经看到了如何使用 Ctrl + Enter
来运行单元格,但是还有很多。键盘快捷键是 Jupyter 环境中非常流行的一个方面,因为它们促进了快速的基于单元格的工作流。许多这些都是在命令模式下可以在活动单元上执行的操作。
下面,你会发现一些 Jupyter 的键盘快捷键列表。你可能不会马上熟悉它们,但是这份清单应该让你对这些快捷键有了了解。
在编辑和命令模式之间切换,分别使用 Esc
和 Enter
。
在命令行模式下:
用 Up
和 Down
键向上和向下滚动你的单元格。
按 A
或 B
在活动单元上方或下方插入一个新单元。
M
将会将活动单元格转换为 Markdown 单元格。
Y
将激活的单元格设置为一个代码单元格。
D + D
(按两次 D
)将删除活动单元格。
Z将撤销单元格删除。 * 按住 Shift,同时按 Up 或 Down ,一次选择多个单元格。
Shift + M
将合并你的选择。Ctrl + Shift + -
,在编辑模式下,将在光标处拆分活动单元格。
你也可以在你的单元格的左边用 Shift + Click
来选择它们。
你可以在自己的 notebook 上试试这些。一旦你有了尝试,创建一个新的 Markdown 单元,我们将学习如何在我们的 notebook 中格式化文本。
Markdown 是一种轻量级的、易于学习的标记语言,用于格式化纯文本。它的语法与 HTML 标记有一对一的对应关系,所以这里的一些经验是有用的,但绝对不是先决条件。请记住,这篇文章是在一个 Jupyter notebook 上写的,所以你所看到的所有的叙述文本和图片都是在 Markdown 完成的。让我们用一个简单的例子来介绍基础知识。
# 这是一级标题。
## 这是一个二级标题。
这是一些构成段落的纯文本。
通过 **粗体** 和 __bold__ ,或 *斜体* 和 _italic_ 添加重点。
段落必须用空行隔开。
* 有时我们想要包含列表。
* 可以缩进。
1. 列表也可以编号。
2. 有序列表。
[有可能包括超链接](https://www.example.com)
内联代码使用单个倒引号:`foo()`,代码块使用三个倒引号:
或可由4个空格组成:
foo()
最后,添加图片也很简单:
当附加图像时,你有三个选项:
.ipynb
文件。.ipynb
的文件更大!Markdown 有很多细节,特别是在超链接的时候,也可以简单地包括纯 HTML。一旦你发现自己突破了上述基础的限制,你可以参考 Markdown 创造者 John Gruber 的官方指南。
每个 notebook 后台都运行一个内核。当你运行一个代码单元时,该代码在内核中执行,任何输出都会返回到要显示的单元格。在单元格间切换时内核的状态保持不变 —— 它与文档有关,而不是单个的单元格。
例如,如果你在一个单元中导入库或声明变量,那么它们将在另一个单元中可用。通过这种方式,你可以将 notebook 文档看作是与脚本文件相当的,除了它是多媒体。让我们试着去感受一下。首先,我们将导入一个 Python 包并定义一个函数。
import numpy as np
def square(x):
return x * x
一旦我们执行了上面的单元格,我们就可以在任何其他单元中引用 np
和 square
。
x = np.random.randint(1, 10)
y = square(x)
print('%d squared is %d' % (x, y))
1 squared is 1
不管你的 notebook 里的单元格顺序如何,这都是可行的。你可以自己试一下,让我们再把变量打印出来。
print('Is %d squared is %d?' % (x, y))
Is 1 squared is 1?
答案毫无疑问。让我们尝试改变 y
。
y = 10
如果我们再次运行包含 print
语句的单元格,你认为会发生什么?我们得到的结果是 Is 4 squared is 10?
!
大多数情况下,你的 notebook 上的工作流将会从上到下,但是返回上文做一些改变是很正常的。在这种情况下,每个单元的左侧的执行顺序,例如 In [6]
,将让你知道你的任何单元格是否有陈旧的输出。如果你想要重置一些东西,从内核菜单中有几个非常有用的选项:
如果你的内核一直在计算中,但你希望停止它,你可以选择 Interupt
选项。
你可能已经注意到,Jupyter 提供了更改内核的选项,实际上有许多不同的选项可供选择。当你通过选择 Python 版本从仪表板中创建一个新的笔记时,你实际上是在选择使用哪个内核。
不仅有不同版本的 Python 的内核,还有(超过 100 种语言),包括 Java 、C ,甚至 Fortran。数据科学家可能特别感兴趣的是 R 和 Julia,以及 imatlab 和 Calysto MATLAB内核 。SoS 内核在一个 notebook 中提供多语言支持。每个内核都有自己的安装指令,但可能需要您在计算机上运行一些命令。