[译] 给初学者的 Jupyter Notebook 教程

给初学者的 Jupyter Notebook 教程

Jupyter Notebook 是一个很是强大的工具,经常使用于交互式地开发和展现数据科学项目。它将代码和它的输出集成到一个文档中,而且结合了可视的叙述性文本、数学方程和其余丰富的媒体。它直观的工做流促进了迭代和快速的开发,使得 notebook 在当代数据科学、分析和愈来愈多的科学研究中愈来愈受欢迎。最重要的是,做为开源项目的一部分,它们是彻底免费的。html

Jupyter 项目是早期 IPython Notebook 的继承者,它在 2010 年首次做为原型发布。尽管在 Jupyter Notebook 中可使用许多不一样的编程语言,但本文将重点介绍 Python,由于在 Jupyter Notebook 中 python 是最多见的。前端

为了充分理解本教程,你应该熟悉编程,特别是 Python 和 pandas(译者注:Pandas 是python的一个数据分析包)。也就是说,若是你有编程经验,这篇文章中的 Python 不会太陌生,而 pandas 也是容易理解的。Jupyter Notebooks 也能够做为一个灵活的平台来运行 pandas 甚至是 Python,这将在这篇文章中体现。python

咱们将会:android

  • 介绍一些安装 Jupyter 和建立你的第一个 notebook 的基本知识。
  • 深刻钻研,学习全部重要的术语。
  • 探索笔记是如何轻松地在网上共享和发布。事实上,这篇文章就是一个 Jupyter notebook!这里的一切都是在 Jupyter notebook 环境中编写的,而你正在以只读的形式查看它。

Jupyter Notebook 数据分析实例

咱们将经过一个样本分析,来回答一个真实的问题,这样你就能够看到一个 notebook 的工做流是如何使任务直观地完成的,当咱们分享给其余人时也可让其余人更好地理解。ios

假设你是一名数据分析师,你的任务是弄清楚美国最大公司的利润变化历史。你会发现自从 1955 年第一次发表这个名单以来,已有超过 50 年的财富 500 强企业的数据集,这些数据都是从《财富》的公共档案中收集来的。咱们已经建立了一个可用数据的 CSV 文件(你能够在这里获取它)。git

正如咱们将要演示的,Jupyter Notebooks 很是适合这项调查。首先,让咱们安装 Jupyter。github

安装

初学者开始使用 Jupyter Notebooks 的最简单方法是安装 Anaconda。Anaconda 是最普遍使用的用于数据科学的 Python 发行版,而且预装了全部经常使用的库和工具。除了 Jupyter 以外,Anaconda 中还封装了一些 Python 库,包括 NumPypandasMatplotlib,而且这完整的1000+列表是详尽的。这使你能够在本身完备的数据科学研讨会中运行,而不须要管理无数的安装包或担忧依赖项和特定操做系统的安装问题。web

安装 Anaconda:编程

  1. 下载支持 Python 3 (就不用 Python 2.7 了)的最新版本 Anaconda。
  2. 按照下载页面或可执行文件中的说明安装 Anaconda。

若是你是已经安装了 Python 的更高级的用户,而且更喜欢手动管理你的软件包,那么你可使用pip:后端

pip3 install jupyter
复制代码

建立你的第一个 Notebook

在本节中,咱们将看到如何运行和保存 notebooks,熟悉它们的结构,并理解接口。咱们将会熟悉一些核心术语,这些术语将引导你对如何使用 Jupyter notebooks 进行实际的理解,并为下一节作铺垫,该部分将经过示例数据分析,并将咱们在这里学到的全部东西带到生活中。

运行 Jupyter

在 Windows 上,你能够经过将 Anaconda 快捷方式添加到你的开始菜单来运行 Jupyter,它将在你的默认网页浏览器中打开一个新的标签,看起来就像下面的截图同样。

Jupyter control panel

这是 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 (或者你喜欢的版本)。

New notebook menu

咱们立刻能看到成果了!你的第一个 Jupyter Notebook 将在新标签页打开 - 每一个 notebook 使用它本身的标签,由于你能够同时打开多个 notebook。若是您切换回仪表板,您将看到新文件 Untitled 。你应该看到一些绿色的文字告诉 notebook 正在运行。

什么是 ipynb 文件?

理解这个文件究竟是什么是颇有用的。每个 .ipynb 文件是一个文本文件,它以一种名为 JSON 的格式描述你的 notebook 的内容。每一个单元格及其内容,包括已被转换成文本字符串的图像附件,都与一些元数据一块儿列出。你能够本身编辑这个 -- 若是你知道你在作什么! -- 经过在 notebook 的菜单栏中选择 "Edit > Edit Notebook Metadata"。

你还能够经过在仪表板上的控件中选择 Edit 来查看你的 notebook 文件的内容,可是重要的是能够;除了好奇以外没有理由这样作,除非你真的知道你在作什么。

notebook 的接口

既然你面前有一个打开的 notebook,它的界面就不会看起来彻底陌生;毕竟,Jupyter 实际上只是一个高级的文字处理器。为何不看一看?查看菜单以了解它,尤为是花点时间浏览命令选项板(这是带键盘图标的小按钮(或 Ctrl + Shift + P))下滚动命令列表。

New Jupyter Notebook

您应该注意到两个很是重要的术语,这对您来讲多是全新的:单元格内核。它们是理解 Jupyter 和区分 Jupyter 不仅是一个文字处理器的关键。幸运的是,这些概念并不难理解。

  • 内核是一个“计算引擎”,它执行一个 notebook 文档中包含的代码。
  • 单元格是一个容器,用于装载在 notebook 中显示的文本或是会被 notebook 内核执行的代码。

单元格

稍后咱们再讨论内核,在这以前咱们先来了解一下单元格。单元格构成一个笔记本的主体。在上面一节的新建的 notebook 屏幕截图中,带有绿色轮廓的盒子是一个空的单元格。咱们将介绍两种主要的单元格类型:

  • 代码单元包含要在内核中执行的代码,并在下面显示它的输出。
  • Markdown 单元包含使用 Markdown 格式化的文本,并在运行时显示其输出。

新的 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 的键盘快捷键列表。你可能不会立刻熟悉它们,可是这份清单应该让你对这些快捷键有了了解。

  • 在编辑和命令模式之间切换,分别使用 EscEnter
  • 在命令行模式下:
    • UpDown 键向上和向下滚动你的单元格。
    • AB 在活动单元上方或下方插入一个新单元。
    • M 将会将活动单元格转换为 Markdown 单元格。
    • Y 将激活的单元格设置为一个代码单元格。
    • D + D(按两次 D)将删除活动单元格。
    • Z将撤销单元格删除。    * 按住 Shift,同时按 UpDown ,一次选择多个单元格。
      • 选择了 multple,Shift + M 将合并你的选择。
  • Ctrl + Shift + -,在编辑模式下,将在光标处拆分活动单元格。
  • 你也能够在你的单元格的左边用 Shift + Click 来选择它们。

你能够在本身的 notebook 上试试这些。一旦你有了尝试,建立一个新的 Markdown 单元,咱们将学习如何在咱们的 notebook 中格式化文本。

Markdown

Markdown 是一种轻量级的、易于学习的标记语言,用于格式化纯文本。它的语法与 HTML 标记有一对一的对应关系,因此这里的一些经验是有用的,但绝对不是先决条件。请记住,这篇文章是在一个 Jupyter notebook 上写的,因此你所看到的全部的叙述文本和图片都是在 Markdown 完成的。让咱们用一个简单的例子来介绍基础知识。

# 这是一级标题。
## 这是一个二级标题。
这是一些构成段落的纯文本。
经过 **粗体**__bold__ ,或 *斜体*_italic_ 添加剧点。

段落必须用空行隔开。

* 有时咱们想要包含列表。
  * 能够缩进。

1. 列表也能够编号。
2. 有序列表。

[有可能包括超连接](https://www.example.com)

内联代码使用单个倒引号:`foo()`,代码块使用三个倒引号:

\``` \bar() \``` 或可由4个空格组成: foo() 最后,添加图片也很简单:![Alt](https://www.example.com/image.jpg) 复制代码

当附加图像时,你有三个选项:

  • 使用一个在 web 上的图像的 URL。

  • 使用一个与你的 notebook 一块儿维护的本地 URL,例如在同一个 git 仓库中。

  • 经过 "Edit > Insert Image" 添加附件;这将把图像转换成字符串并存储在你的 notebook 中的 .ipynb 文件。

  • 注意这将使你的 .ipynb 的文件更大!

Markdown 有不少细节,特别是在超连接的时候,也能够简单地包括纯 HTML。一旦你发现本身突破了上述基础的限制,你能够参考 Markdown 创造者 John Gruber 的官方指南

内核

每一个 notebook 后台都运行一个内核。当你运行一个代码单元时,该代码在内核中执行,任何输出都会返回到要显示的单元格。在单元格间切换时内核的状态保持不变 —— 它与文档有关,而不是单个的单元格。

例如,若是你在一个单元中导入库或声明变量,那么它们将在另外一个单元中可用。经过这种方式,你能够将 notebook 文档看做是与脚本文件至关的,除了它是多媒体。让咱们试着去感觉一下。首先,咱们将导入一个 Python 包并定义一个函数。

import numpy as np

def square(x):
    return x * x
复制代码

一旦咱们执行了上面的单元格,咱们就能够在任何其余单元中引用 npsquare

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。数据科学家可能特别感兴趣的是 RJulia,以及 imatlabCalysto MATLAB内核SoS 内核在一个 notebook 中提供多语言支持。每一个内核都有本身的安装指令,但可能须要您在计算机上运行一些命令。

实例分析

如今咱们已经看了一个 Jupyter Notebook,是时候看看它们在实践中使用了,这应该会让你更清楚地了解它们为何那么受欢迎。如今是时候开始使用前面提到的财富 500 数据集了。请记住,咱们的目标是了解美国最大公司的利润在历史上是如何变化的。

值得注意的是,每一个人都会有本身的喜爱和风格,可是通常原则仍然适用,若是你愿意,你能够在本身的 notebook 上跟随这一段,这也给了你自由发挥空间。

命名你的 notebook

在开始编写项目以前,你可能想要给它一个有意义的名称。也许有点让人困惑,你不能从 Notebook 的应用程序中命名或重命名你的 notebook,而必须使用仪表盘或你的文件浏览器来重命名 .ipynb 文件。咱们将返回到仪表板,以重命名你以前建立的文件,它将有默认的 notebook 的文件名是 Untitled.ipynb

你不能在 notebook 运行时重命名它,因此你首先要关闭它。最简单的方法就是从 notebook 菜单中选择 “File > Close and Halt”。可是,您也能够经过在笔记本应用程序内 “Kernel > Shutdown” 或在仪表板中选择 notebook 并点击 “Shutdown” (见下图)来关闭内核。

A running notebook

而后你能够选择你的 notebook,并在仪表板控件中点击 “Rename”。

A running notebook

注意,在你的浏览器中关闭笔记的标签页将不会像在传统的应用程序中关闭文档的方式同样关闭你的 notebook。notebook 的内核将继续在后台运行,须要在真正“关闭”以前中止运行 —— 不过若是你不当心关掉了你的标签或浏览器,这就很方便了!若是内核被关闭,你能够关闭该选项卡,而不用担忧它是否还在运行。

若是你给你的 notebook 起了名字,打开它,咱们就能够开始实践了。

设置

一般一开始就使用一个专门用于导入和设置的代码单元,所以若是你选择添加或更改任何内容,你能够简单地编辑和从新运行该单元,而不会产生任何反作用。

%matplotlib inline

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set(style="darkgrid")
复制代码

咱们导入 pandas 来处理咱们的数据,Matplotlib 绘制图表,Seaborn 使咱们的图表更美。导入 NumPy 也是很常见的,可是在这种状况下,虽然咱们使用的是 pandas,但咱们不须要显式地使用它。第一行不是 Python 命令,而是使用一种叫作行魔法的东西来指示 Jupyter 捕获 Matplotlib 图并在单元输出中呈现它们;这是超出本文范围的一系列高级特性之一。

让咱们来加载数据。

df = pd.read_csv('fortune500.csv')
复制代码

在单个单元格中这样作也是明智的,由于咱们须要在任什么时候候从新加载它。

保存和检查点

如今咱们已经开始了,最好的作法是按期存储。按 Ctrl + S 键能够经过调用“保存和检查点”命令来保存你的 notebook,可是这个检查点又是什么呢?

每当你建立一个新的 notebook 时,都会建立一个检查点文件以及你的 notebook 文件;它将位于你保存位置的隐藏子目录中称做 .ipynb_checkpoints,也是一个 .ipynb 文件。默认状况下,Jupyter 将每隔 120 秒自动保存你的 notebook,而不会改变你的主 notebook 文件。当你“保存和检查点”时,notebook 和检查点文件都将被更新。所以,检查点使你可以在发生意外事件时恢复未保存的工做。你能够经过 “File > Revert to Checkpoint“ 从菜单恢复到检查点。

调查咱们的数据集

咱们正在稳步前进!咱们的笔记已经被安全保存,咱们将数据集 df 加载到最经常使用的 pandas 数据结构中,这被称为 DataFrame ,看起来就像一张表格。那咱们的数据集会是怎样的?

df.head()
复制代码
Year Rank Company Revenue (in millions) Profit (in millions)
0 1955 1 General Motors 9823.5 806
1 1955 2 Exxon Mobil 5661.4 584.8
2 1955 3 U.S. Steel 3250.4 195.4
3 1955 4 General Electric 2959.1 212.6
4 1955 5 Esmark 2510.8 19.1
df.tail()
复制代码
Year Rank Company Revenue (in millions) Profit (in millions)
25495 2005 496 Wm. Wrigley Jr. 3648.6 493
25496 2005 497 Peabody Energy 3631.6 175.4
25497 2005 498 Wendy's International 3630.4 57.8
25498 2005 499 Kindred Healthcare 3616.6 70.6
25499 2005 500 Cincinnati Financial 3614.0 584

看上去不错。咱们有须要的列,每一行对应一个公司一年的财务数据。

让咱们重命名这些列,以便稍后引用它们。

df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
复制代码

接下来,咱们须要探索咱们的数据集,它是否完整? pandas 是按预期读的吗?缺乏值吗?

len(df)
复制代码
25500
复制代码

好吧,看起来不错 —— 从 1955 年到 2005 年,每一年都有 500 行。

让咱们检查咱们的数据集是否如咱们预期的那样被导入。一个简单的检查就是查看数据类型(或 dtypes)是否被正确地解释。

df.dtypes
复制代码
year         int64
rank         int64
company     object
revenue    float64
profit      object
dtype: object
复制代码

看起来利润栏有点问题 —— 咱们但愿它像收入栏同样是 float64。这代表它可能包含一些非整数值,因此让咱们看一看。

non_numberic_profits = df.profit.str.contains('[^0-9.-]')
df.loc[non_numberic_profits].head()
复制代码
year rank company revenue profit
228 1955 229 Norton 135.0 N.A.
290 1955 291 Schlitz Brewing 100.0 N.A.
294 1955 295 Pacific Vegetable Oil 97.9 N.A.
296 1955 297 Liebmann Breweries 96.0 N.A.
352 1955 353 Minneapolis-Moline 77.4 N.A.

就像咱们猜想的那样!其中一些值是字符串,用于表示丢失的数据。还有其余缺失的值么?

set(df.profit[non_numberic_profits])
复制代码
{'N.A.'}
复制代码

这很容易解释,可是咱们应该怎么作呢?这取决于缺失了多少个值。

len(df.profit[non_numberic_profits])
复制代码
369
复制代码

它只是咱们数据集的一小部分,虽然不是彻底可有可无,由于它仍然在 1.5% 左右。若是包含 N.A. 的行是简单地、均匀地按年分布的,那最简单的解决方案就是删除它们。因此让咱们浏览一下分布。

bin_sizes, _, _ = plt.hist(df.year[non_numberic_profits], bins=range(1955, 2006))
复制代码

Missing value distribution

粗略地看,咱们能够看到,在一年中无效值最多的状况也小于 25,而且因为每一年有 500 个数据点,删除这些值在最糟糕的年份中只占不到 4% 的数据。事实上,除了 90 年代的激增,大多数年份的缺失值还不到峰值的一半。为了咱们的目的,假设这是能够接受的,而后移除这些行。

df = df.loc[~non_numberic_profits]
df.profit = df.profit.apply(pd.to_numeric)
复制代码

咱们看看有没有生效。

len(df)
复制代码
25131
复制代码
df.dtypes
复制代码
year         int64
rank         int64
company     object
revenue    float64
profit     float64
dtype: object
复制代码

不错!咱们已经完成了数据集的设置。

若是你要将 notebook 作成一个报告,你能够不使用咱们建立的研究的单元格,包括这里的演示使用 notebook 的工做流,合并相关单元格(请参阅下面的高级功能部分)并建立一个数据集设置单元格。这意味着若是咱们把咱们的数据放在别处,咱们能够从新运行安装单元来恢复它。

使用 matplotlib 进行绘图

接下来,咱们能够经过计算年平均利润来解决这个问题。咱们不妨把收入也画出来,因此首先咱们能够定义一些变量和一种方法来减小咱们的代码。

group_by_year = df.loc[:, ['year', 'revenue', 'profit']].groupby('year')
avgs = group_by_year.mean()
x = avgs.index
y1 = avgs.profit

def plot(x, y, ax, title, y_label):
    ax.set_title(title)
    ax.set_ylabel(y_label)
    ax.plot(x, y)
    ax.margins(x=0, y=0)
复制代码

如今让咱们开始画图。

fig, ax = plt.subplots()
plot(x, y1, ax, 'Increase in mean Fortune 500 company profits from 1955 to 2005', 'Profit (millions)')
复制代码

Increase in mean Fortune 500 company profits from 1955 to 2005

它看起来像一个指数,但它有一些大的凹陷。它们必定是对应于上世纪 90 年代初的经济衰退互联网泡沫。在数据中能看到这一点很是有趣。但为何每次经济衰退后,利润都能恢复到更高的水平呢?

也许收入能告诉咱们更多。

y2 = avgs.revenue
fig, ax = plt.subplots()
plot(x, y2, ax, 'Increase in mean Fortune 500 company revenues from 1955 to 2005', 'Revenue (millions)')
复制代码

Increase in mean Fortune 500 company revenues from 1955 to 2005

这为故事增添了另外一面。收入几乎没有受到严重打击,财务部门的会计工做作得很好。

借助 Stack Overflow 上的帮助,咱们能够用 +/- 它们的标准偏移来叠加这些图。

def plot_with_std(x, y, stds, ax, title, y_label):
    ax.fill_between(x, y - stds, y + stds, alpha=0.2)
    plot(x, y, ax, title, y_label)

fig, (ax1, ax2) = plt.subplots(ncols=2)
title = 'Increase in mean and std Fortune 500 company %s from 1955 to 2005'
stds1 = group_by_year.std().profit.as_matrix()
stds2 = group_by_year.std().revenue.as_matrix()
plot_with_std(x, y1.as_matrix(), stds1, ax1, title % 'profits', 'Profit (millions)')
plot_with_std(x, y2.as_matrix(), stds2, ax2, title % 'revenues', 'Revenue (millions)')
fig.set_size_inches(14, 4)
fig.tight_layout()
复制代码

jupyter-notebook-tutorial_48_0

这是惊人的,标准误差是巨大的。一些财富 500 强的公司赚了数十亿,而另外一些公司却损失了数十亿美圆,并且随着这些年来利润的增加,风险也在增长。也许有些公司比其余公司表现更好;前 10% 的利润是否或多或少会比最低的10%稳定一些?

接下来咱们有不少问题能够看,很容易看到在 notebook 上的工做流程是如何与本身的思惟过程相匹配的,因此如今是时候为这个例子画上句号了。这一流程帮助咱们在无需切换应用程序的状况下轻松地研究咱们的数据集,而且咱们的工做能够当即共享和重现。若是咱们但愿为特定的目标人群建立一个更简洁的报告,咱们能够经过合并单元和删除中间代码来快速重构咱们的工做。

分享你的 notebook

当人们谈论分享他们的 notebook 时,他们一般会考虑两种模式。大多数状况下,我的共享其工做的最终结果,就像本文自己同样,这意味着共享非交互式的、预渲染的版本的 notebook;然而,也能够在 notebook 上借助诸如 Git 这样的辅助版本控制系统进行协做。

也就是说,有一些新兴的公司在 web 上提供了在云中运行交互式 Jupyter Notebook 的能力。

在你分享以前

当你导出或保存它时,共享的 notebook 将会以被导出或保存的那一刻的状态显示,包括全部代码单元的输出。所以,为了确保你的 notebook 是共享的,你能够在分享以前采起一些步骤:

  1. 点击 "Cell > All Output > Clear"
  2. 点击 "Kernel > Restart & Run All"
  3. 等待您的代码单元完成执行,并检查它们是否按预期执行。

这将确保你的 notebook 不包含中间输出,不包含陈旧的状态,并在共享时按顺序执行。

导出你的 notebook

Jupyter 内置支持导出 HTML 和 PDF 以及其余几种格式,你能够在 File > Download As 菜单下找到。若是你但愿与一个小型的私有组共享你的 notebook,这个功能极可能是你所须要的。事实上,许多学术机构的研究人员都有一些公共或内部的网络空间,由于你能够将一个 notebook 导出到一个 HTML 文件中,Jupyter notebook 能够成为他们与同行分享成果的一种特别方便的方式。

可是,若是共享导出的文件并不能让你满意,那么还有一些更直接的很是流行的共享 .ipynb 文件到网上的方法。

GitHub

截止到 2018 年初,GitHub 上的公共 notebook 数量超过了 180 万,它无疑是最受欢迎的与世界分享 Jupyter 项目的独立平台。GitHub 已经集成了对 .ipynb 的文件渲染的支持,你能够直接将其存储在其网站的仓库和 gists 中。若是你还不知道,GitHub 是一个代码托管平台,用于为使用 Git 建立的存储库进行版本控制和协做。你须要建立一个账户来使用他们的服务,同时 Github 标准账户是免费的。

当你有了 GitHub 帐户,在 GitHub 上共享一个 notebook 最简单的方法甚至都不须要 Git。自 2008 年以来, GitHub 为托管和共享代码片断提供了Gist 服务,每一个代码段都有本身的存储库。使用 Gists 共享一个 notebook:

  1. 登陆而且浏览 gist.github.com
  2. 用文件编辑器打开 .ipynb 文件, 全选而且拷贝里面的 JSON 。
  3. 将笔记的 JSON 粘贴到中 gist 中。
  4. 给你的 Gist 命名, 记得添加 .iypnb 后缀,不然不能正常工做。
  5. 点击 "Create secret gist"或者 "Create public gist."

这看起来应该是这样的:

Creating a Gist

若是你建立了一个公共的 Gist,你如今就能够和任何人分享它的 URL,其余人将可以 fork 和 clone 你的工做。

建立本身的 Git 存储库并在 GitHub 上共享,这超出了本教程的范围,可是 GitHub 提供了大量的指南可供你参考。

对于那些使用 git 的人来讲,一个额外的技巧是在 .gitignore 中为 Jupyter 建立的 .ipynb_checkpoints 目录添加例外,由于咱们不须要将检查点文件提交给到仓库。

从 2015 年起,NBViewer 每一个星期都会渲染成千上万的 notebook,它已然成了最受欢迎的 notebook 渲染器。若是你已经在某个地方把你的 Jupyter Notebook 放在网上,不管是 GitHub 仍是其余地方,NBViewer 均可以读取你的 notebook,并提供一个可共享的 URL。做为项目 Jupyter 的一部分提供的免费服务,你能够在 nbview.jupyter.org 找到相关服务。

最初是在 GitHub 的 Jupyter Notebook 集成以前开发的,NBViewer 容许任何人输入 URL、Gist ID 或 GitHub username/repo/filename,并将其做为网页呈现。一个 Gist 的 ID 是其 URL 末尾惟一的数字;例如,在 https://gist.github.com/username/50896401c23e0bf417e89e1de 中最后一个反斜杠后的字符串。若是你输入了 GitHub username/repo/filename ,你将看到一个最小的文件浏览器,它容许你访问用户的仓库及其内容。

NBViewer 显示的 notebook 的 URL 是基于正在渲染的 notebook 的 URL 的而且不会改变,因此你能够和任何人分享它,只要原始文件保持在线 —— NBViewer 不会缓存文件很长时间。

结语

从基础知识入手,咱们已经掌握了 Jupyter Notebook 的工做流程,深刻研究了IPython 的更多高级功能,并最终学会如何与朋友、同事和世界分享咱们的工做。咱们从一个笔记上完成了这一切!

能够看到,notebook 是如何经过减小上下文切换和在项目中模拟天然的思惟发展的方式来提升工做经验的。Jupyter Notebook。Jupyter Notebook 的功能也应该是显而易见的,咱们已经介绍了大量的资源,让你开始在本身的项目中探索更高级的特性。

若是你想为本身的 Notebooks 提供更多的灵感,Jupyter 已经整理好了(一个有趣的 Jupyter Notebook 图库),你可能会发现它有帮助,而且你会发现 Nbviewer 的主页连接到一些真正的高质量笔记本的例子。也能够查看咱们的 Jupyter Notebooks 提示列表

想了解更多关于 Jupyter Notebooks 的知识吗?咱们有一个有指导的项目,你可能会感兴趣。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索