Jupyter Notebook入门指南
发布日期:2025-01-04 11:43 点击次数:77
作者:京东科技隐私计算产品部 孙晓军1. Jupyter Notebook介绍
图1 Jupter项目整体架构
[https://docs.jupyter.org/en/latest/projects/architecture/content-architecture.html]
Jupyter Notebook是一套基于web的交互式开发环境。用户可以在线开发和分享包含代码和输出的交互式文档,支持实时代码,数学方程,可视化和 markdown等。用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。
Jupyter Notebook内部通过内核维护状态并运行代码片段,浏览器显示代码片段和其执行的结果。Jupyter Notebook提供了一个用户交互式的开发环境,用户可以通过执行一部分代码片段,并观察执行结果。这种交互式设计,使得Jupyter Notebook非常适合数据科学和机器学习的开发工作。
注意本文的代码和脚本,均基于Jupyter Notebook v6.5.2稳定版本。
2. Jupyter的工作方式
图2 Jupter Notebook工作方式
[https://docs.jupyter.org/en/latest/projects/architecture/content-architecture.html]
Jupyter的主要工作单元是Jupyter Server和Kernel。其中Jupyter Server用来提供基于Web的界面和API服务,Kernel用来执行代码片段。浏览器通过Http和Websockets的方式和Jupyter Server进行交互,Jupyter Server和kernel之间,通过ZeroMQ进行数据通信。
Jupyter Server采用经典的MVC模式,使用了tornado作为web服务器,用来提供地址映射和控制器逻辑,使用jinja2来提供模板视图功能。
Jupyter Notebook(v6.5.2)项目的主要模块结构如下:
模块
说明
notebook
Notebook功能模块。
terminal
终端模块。为Jupyter提供控制台交互能力。
view
文件可视化模块。比如pdf文件的显示。
tree
工作区目录树
nbconvert
格式转换模块,可以把Jupyter Notebook转换成html,pdf等格式
kernel
Jupyter Notebook 内核
services
Jupyter Notebook REST API模块
i18n
Jupyter Notebook多语言资源
3. 安装Jupyter Notebook前置条件
Python和pip
不同的Jupyter Notebook对Python有不同的版本要求。我们安装的最新的稳定版本v6.5.2的Jupyter Notebook,要求Python的最低版本为3.6。注意这个Python的版本,不同于内核的Python版本。对于Jupyter内核来说,支持的Python版本和Jupyter Notebook依赖的Python版本没有关系。
在Linux系统下安装Jupyter Notebook
使用pip安装Jupyter notebook非常简单。如果服务器同时拥有Python2和Python3的pip,注意需要使用pip3来替换命令中的pip。
4. 配置和启动JupyterJupyter提供了大量的启动参数,用来配置Jupyter Server。我们可以在启动Jupyter服务时,通过命令行参数的方式配置当前启动的服务,但更普遍的方式是使用Jupyter的配置文件。
Jupyter直接使用一个Python文件来配置Jupyter服务,所有的配置项均通过Python代码来完成。常用的配置项及其说明如下:
名称
默认值
说明
c.NotebookApp.allow_root
False
为了安全,Jupyter默认不允许使用root用户启动。如果需要以root用户的身份启动Jupyter,需要开启此设定
c.NotebookApp.allow_origin
''
当需要Jupyter内嵌到iframe时,可以设置为“*“来避免跨origin的限制
c.NotebookApp.ip
localhost
当需要通过外网地址来访问Jupyter服务时,需要设置一个有效的服务器IP地址。
c.NotebookApp.port
8888
Jupyter server对外服务端口
c.NotebookApp.notebook_dir
/
Jupyter的工作空间,默认可以访问服务器上当前用户的所有文件系统
c.NotebookApp.open_browser
True
启动服务后是否立即通过浏览器打开服务地址
c.NotebookApp.default_url
/tree
Jupyter服务的默认地址
c.NotebookApp.extra_static_paths
[]
扩展静态文件目录
c.NotebookApp.extra_template_paths
[]
扩展模板文件目录
c.KernelSpecManager.allowed_kernelspecs
set()
默认允许使用所有的kernel
c.NotebookApp.nbserver_extensions
{}
允许加载的Jupyter Server扩展
5. 使用Jupyter5.1. 创建Notebook启动Jupyter 后,在浏览器内输入 http://服务器地址:端口/,Jupyter会默认重定向到.default_url指定的工作区目录树地址,默认是工作区目录树的界面。
如果在访问的过程中,使用了默认的token作为其认证方式,那么在首次打开时,需要输入Jupyter Notebook的token值,这个值可以在启动Jupyter时的控制台输出中找到,或者使用Jupyter命令来查询
图3 Jupter Notebook的默认工作区目录树页面
Jupyter Notebook通过Jupyter Server提供基于Web的平台无关的工作方式,这使得跨平台开发和协作,代码分享等能力变得比传统IDE更加容易。
在Jupyter 工作区管理界面,用户可以灵活地以类似文件系统的方式管理工作区的数据。可以创建文件和文件夹,编辑文件和文件夹,可以上传和下载文件。通过选择一个Jupyter内核,可以创建一个Notebook文件。
图4 通过Jupyter内核创建一个Notebook
5.2. 使用Notebook使用Python3内核创建一个Notebook后,我们得到一个xxx.ipynb(IPython Notebook)文件。这个文件是一个json格式的文本文件,其中包含了我们在Notebook中编写的代码和文本内容,也包含了界面上没有显示的元数据信息。通过在工作区目录界面选择一个notebook文件,点击编辑,我们可以查看到ipynb文件的原始内容。
图5 ipynb文件的原始内容
我们可以像使用其它IDE类似的方式来使用Notebook,在使用Notebook上,我们主要关注下Jupyter内核和单元格。
内核是执行单元格代码的核心进程,不同的内核,决定了我们在单元格中能够编写哪些语言的代码,以及对应了指定的编程语言的哪个版本等信息。
单元格是整个Notebook的核心组成部分,我们编写的代码和文本,通过一些列Notebook单元格来组成。Notebook提供了Code,Markdown, Raw NBConvert, Heading四种类型的单元格。
•Code单元格。用来编写内核指定语言的程序代码
•Markdown单元格。使用Markdown编辑器的语法来编辑富文本
•Raw NBConvert单元格。原始的文本,不会被当作代码或markdown被解释执行
•Heading单元格。Heading是Mardown的一个子集,对应了Markdown中的标题编写语法
Jupyter Notebook使用了机器学习中检查点的概念,在我们修改Notebook的过程中,Jupyter会自动保存我们的修改,我们也可以通过【文件】->【保存】来手动保存检查点。检查点文件包含了我们编写的Notebook内容,以及执行代码单元格之后的输出。我们可以在工作空间的“.ipynb_checkpoints”文件夹下,找到这些检查点文件。
图6 使用Jupyter单元格来编写交互式代码
5.3. 分享Notebook相较于使用传统的IDE编写的代码,基于Web服务的Jupyter Notebook在代码分享上拥有着天然的优势。
在Jupyter Notebook中,我们可以通过两种不同的方式分享我们创作的nootbook。
交互式Notebook文档
传统的技术文档或者说明书,通过静态的文本,配合图片和视频,来描述和讲解特定的技术或功能。有了Jupyter Notebook后,我们仍然可以使用Notebook来编写类似传统的技术文档。在此基础上,我们可以加入更生动的代码交互单元格,用户通过查看文档说明,并与文档中提供的代码进行互动,可以更生动地介绍产品中的功能和技术。每个Jupyter Notebook的ipynb文件,都对应了一个独立的访问地址: :8899/notebooks/my_notebook.ipynb ,通过分享此文件的地址,其他用户可以方便地使用包含了富文本和可执行的代码的交互式Notebook文档。
离线Notebook文档
我们通过逐步执行文档中的所有单元格,得到一个包含了我们编写的说明和代码,以及代码执行的输出结果的完整文档。之后点击【文件】-> 【另存为】,选择一种合适的文件格式。我们可以把文档导出为一份静态文件,通过共享此静态文件,我们实现了Notebook文档的离线分享。
5.4. 魔法函数Jupyter Notebook提供了一些列魔法函数来增强Jupyter Code单元格的功能,通过魔法函数,我们能够执行javascript脚本,html代码,运行另一个可执行程序等许多额外的功能。
我们可以在Jupyter代码单元格中使用 %lsmagic命令来查看所有的魔法函数,如果要阅读详细的魔法函数的使用说明,可以参考: https://ipython.readthedocs.io/en/stable/interactive/magics.html
魔法函数分为行魔法函数,单元格魔法函数和会话魔法函数。顾名思义,行魔法函数只对当前行起作用,而单元格魔法函数则作用于整个单元格,会话魔法函数则作用于整个会话期间。
一些常用的魔法函数:
指令
说明
%matplotlib
设置matplot绘图的显示模式
%%javascript
单元格内的代码被识别为javascript代码
%%html
单元格内的代码被识别为html代码
%run
执行外部脚本文件
%pwd
获取当前工作的目录位置(非工作空间目录位置)
%writefile
以文件形式保存当前单元格代码
%timeit
获取本行代码的执行时间