Jupyter 基础知识

Jupyter概述

Project Jupyter是一个非营利性的开源项目,诞生于2014年的IPython项目,该项目支持跨所有编程语言的交互式数据科学和科学计算,并承认永久性开源免费。

目前Jupyter主要包含四个产品:

  • Jupyter Notebook
  • JupyterLab
  • JupyterHub
  • Voilà

除此之外,Jupyter还提供了一个便捷的web应用程序nbviewer用于分享Jupyter Notebook,以及小部件Widgets,用于支持在Jupyter笔记本中进行交互式数据可视化。

Jupyter文档汇总页面

Jupyter Notebook

一个开源的网络应用程序,它允许你创建和共享包含实时代码、方程式、可视化和叙事文本的文档,适合捕捉整个计算过程:开发、记录和执行代码。用途包括:数据清理和转换,数值模拟,统计建模,数据可视化,机器学习等等

Jupyter notebook主要由以下两个部分组成

web应用程序:一个基于浏览器的工具,用于交互式编写文档,它结合了解释性文本、数学、计算和它们的富媒体输出。主要特性如下:

  • 在浏览器中编辑代码,自动语法高亮,缩进,代码补全/纠正(Tab键)
  • 从浏览器中执行代码,并附加计算结果到代码上
  • 使用富媒体表示显示计算结果,如HTML、LaTeX、PNG、SVG等
  • 使用Markdown对富文本进行浏览器内编辑(可用于代码注释)
  • 能在markdown单元格中用LaTeX表示数学符号,并由MathJax原生呈现

笔记本文档:在web应用程序中可见的所有内容的表示,包括计算的输入和输出、解释性文本、数学、图像和对象的富媒体表示。主要特性如下:

  • 文档内部是JSON文件,并以.ipynb扩展名保存。
  • 由于JSON是一种纯文本格式,因此可以对其进行版本控制并与同事共享。
  • 通过nbconvert工具,文档可以导出为一系列静态格式,包括HTML、reStructuredText、LaTeX、PDF和幻灯片。
  • .ipynb扩展名的文件可通过nbviewer进行共享,当然也可以不依赖于nbviewer,自己通过nbconvert进行静态转换,然后分享。

Jupyter Notebook主要维护支持以下几款浏览器的最新版本:

  • Chrome
  • Safari
  • Firefox

Jupyter Notebook 官方文档 Jupyter Notebook 官方案例

1 Jupyter安装与启动

1.1 安装

先决条件:Python 推荐安装方式:安装Anaconda(同时包含Python和Jupyter) 可选安装方式:在配有Python环境的前提下通过pip安装jupyter

经典版Jupyter Notebook安装

1.2 启动

在终端执行命令:

#启动jupyter notebook(包装版本)
jupyter notebook 
#启动jupyter notebook(真实版本)
jupyter-notebook
#启动时打开指定的.ipynb文件
jupyter notebook notebook.ipynb
#启动时修改端口号
jupyter notebook --port 9999
#启动时不打开web浏览器
jupyter notebook --no-browser
#查看启动的其他命令
jupyter notebook --help

启动成功后系统将自动跳转到对应页面(默认地址为http://localhost:8888

2 notebook界面

管理面板(Notebook Dashboard): 附件/Pasted image 20210918230708.png

编辑界面(Notebook Editor): 当您创建一个新的记事本文档时,您将看到记事本名称、菜单栏、工具栏和一个空的代码单元格。 附件/Pasted image 20210918230650.png

笔记本由一系列单元格组成。单元格是一个多行文本输入字段,它的内容可以通过使用Shift-Enter执行,或单击工具栏的“Play”按钮,或单击菜单栏中的“cell, Run”。最常用的单元格类型主要为代码单元格( code cells)、Markdown单元格(markdown cells)和原始单元格(raw cells)。

其中原始单元格(raw cells)提供了一个可以直接写入输出的地方。原始单元格直接通过nbconvert传递,保留并展现出目标的应有格式。例如,您可以在原始单元格中键入完整的LaTeX,只有通过nbconvert转换后,才会呈现LaTeX的渲染结果。

3 代码单元格

代码单元格允许编辑和编写新代码,具有完整的语法突出显示和Tab键代码补全功能。

  • 运行Python代码的内核默认是IPython。
  • 当代码单元被执行时,它所包含的代码被发送到与notebook相关联的内核。
  • 内核计算返回的结果将作为单元格的输出显示在笔记本中。
  • 输出不仅限于文本,还可能有许多其他形式的输出,包括matplotlib图形和HTML表(例如,在pandas数据分析包中使用的)。这被称为IPython的丰富显示功能。

4 Markdown 单元格

以一种读写的方式记录计算过程,使用富文本交替使用描述性文本和代码。在IPython中,这是通过使用Markdown语言标记文本来实现的。相应的单元格称为Markdown单元格。

  • Markdown语言提供了一种执行文本标记的简单方法,即指定文本格式、表单列表等(类似于Word的功能)
  • 通过#来标识标题,来为文档提供结构
  • 执行Markdown单元格时,Markdown代码将转换为相应的格式化富文本
  • 通过$...$$$...$$来引入LaTeX符号描述数学公式,并通过执行单元格输出高质量的HTML公式排版

Markdown语法参考 LaTeX语法参考

5 快捷键

进入Jupyter Notebook在菜单栏中的help中可以查看快捷键

Jupyter笔记本有两种不同的键盘输入模式

  • 编辑模式允许您将代码或文本输入到一个单元格中,并通过一个绿色的单元格来表示
  • 命令模式将键盘与笔记本级命令绑定在一起,并通过一个灰色的单元格边界显示,该边框为蓝色的左边框。

命令模式 (按键 Esc 开启)快捷键:

  • F: 查找并且替换
  • Ctrl-Shift-FCtrl-Shift-PP: 打开命令配置
  • Enter : 进入编辑模式
  • Shift-Enter : 运行本单元,选中下个单元(新单元默认为命令模式)
  • Ctrl-Enter : 运行本单元
  • Alt-Enter : 运行本单元,在其下插入新单元(新单元默认为编辑模式)
  • Y:单元转入代码状态
  • M:单元转入markdown状态
  • R:单元转入raw状态
  • 1:设定 1 级标题
  • 2:设定 2 级标题
  • 3:设定 3 级标题
  • 4:设定 4 级标题
  • 5:设定 5 级标题
  • 6:设定 6 级标题
  • UpK : 选中上方单元
  • DownJ: 选中下方单元
  • Shift-UpShift-K : 扩大选中上方单元
  • Shift-DownShift-J : 扩大选中下方单元
  • A : 在上方插入新单元
  • B : 在下方插入新单元
  • X : 剪切选中的单元
  • C : 复制选中的单元
  • Shift-V : 粘贴到上方单元
  • V : 粘贴到下方单元
  • Z : 撤销删除
  • D,D : 删除选中的单元(连续按两个 D 键)
  • Shift-M : 合并选中的单元
  • Ctrl-SS : 保存并检查当前 NoteBook
  • L : 开关行号(编辑框的行号是可以开启和关
  • Space : 向下滚动

编辑模式 ( Enter 键启动)下快捷键

  • Tab : 代码补全或缩进
  • Shift-Tab : 提示(输出帮助信息,部分函数、类、方法等会显示其定义原型,如果在其后加 ? 再运行会显示更加详细的帮助)
  • Ctrl-]:缩进
  • Ctrl-[:解除缩进
  • Ctrl-A:全选
  • Ctrl-Z:撤销
  • Ctrl-/:注释整行/撤销注释(仅代码状态有效)
  • Ctrl-D:整行删除
  • Ctrl-U:撤销选择
  • Insert:切换 重写标志
  • Ctrl-HomeCtrl-Up : 跳到单元开头
  • Ctrl-EndCtrl-Down : 跳到单元末尾
  • Ctrl-Left : 跳到左边一个字首
  • Ctrl-Right : 跳到右边一个字首
  • Ctrl-Backspace : 删除前面一个字
  • Ctrl-Delete : 删除后面一个字
  • Ctrl-Y:重做
  • Alt-U:重新选择
  • EscCtrl-M:进入命令模式
  • Ctrl-Shift-FCtrl-Shift-P: 打开命令配置
  • Shift-Enter : 运行本单元,选中下一单元(新单元默认为命令模式)
  • Ctrl-Enter : 运行本单元
  • Alt-Enter : 运行本单元,在下面插入一单元(新单元默认为编辑模式)
  • Ctrl-Shift-Minus : 分割单元(按光标所在行进行分割)
  • Ctrl-Shift-Subtract : 分割单元
  • Ctrl-S : 保存并检查文件
  • Up:光标上移或转入上一单元
  • Down :光标下移或转入下一单元

注: 如果快捷键被系统中的其它应用占用,则可能会失效

6 Magic关键字

magic函数系统提供了一系列函数,允许您控制IPython本身的行为,以及许多系统类型的特性。magic函数主要包含两大类,一类是行魔法(Line magic)前缀为%,一类是单元魔法(Cell magic)前缀为%%

行魔法(Line magic)列表

  • %alias:定义系统命令的别名
  • %alias_magic:定义Magic命令的别名
  • %autoawait:设置一个特定的异步代码运行器
  • %autocall:省略函数调用的括号
  • %automagic:省略Magic关键字的前缀%
  • %autosave:设置notebook的自动保存间隔(秒)
  • %bookmark:管理IPython的书签系统(列举、增删)
  • %cd:更改当前工作目录
  • %clear:清空终端
  • %cls:清空终端
  • %colors:切换提示、信息系统和异常处理程序的颜色方案
  • %conda:在当前内核中运行conda包管理器
  • %config:配置IPython
  • %connect_info:打印连接到当前内核的其他客户端的信息
  • %copy:同!copy,shell的复制命令
  • %ddir%ldir:同!dir,shell的文件夹命令
  • %debug:实现断点调试和出错调试的功能
  • %dhist:输出目录的访问历史记录
  • %dirs:输出当前目录的stack?
  • %doctest_mode: 启动或关闭文档测试
  • %echo:同!echo,shell的复制命令
  • %ed%edit:打开编辑器并执行代码
  • %env:环境变量管理(列举、增删)
  • %gui:启动或关闭IPython GUI事件循环集成(event loop integration)
  • %hist%history:输入的历史记录
  • %killbgscripts:杀死所有由%%script产生的BG进程
  • %less%more:通过页面(pager?)显示文件
  • %load:将代码加载到当前前端
  • %load_ext:按模块名加载一个IPython扩展
  • %loadpy:灵活版%load(不限定文件后缀为.py
  • %logoff:暂时停止日志记录
  • %logon:重启日志记录
  • %logstart:开始日志记录
  • %logstate:输出日志系统的状态
  • %logstop:停止日志记录
  • %ls:等效于!dir /on,按名称查看文件信息
  • %lsmagic:列出目前可用的Magic函数
  • %macro:定义一个宏以便将来重新执行
  • %magic:输出Magic函数的系统信息
  • %matplotlib:设置matplotlib(比如常用的%matplotlib inline,省去plt.show()过程)
  • %mkdir:等效于!mkdir,创建文件夹
  • %notebook:notebooks导出与格式转换
  • %page:美化输出格式,并通过页面(pager?)显示
  • %pastebin:文本分享(上传文本到存储网站,返回URL)
  • %pdb:控制pdb交互式调试器的自动调用
  • %pdef:输出任何可调用对象的调用标记(比如输出类的函数构造信息)
  • %pdoc:输出对象的文档字符串
  • %pfile:输出(或遍历页面)的已定义对象的文件
  • %pinfo:提供指定对象的详细信息
  • %pinfo2:提供指定对象的额外详细信息
  • %pip:在当前内核中运行pip包管理器
  • %popd:更改到从堆栈顶部输出的目录
  • %pprint:打开/关闭输出格式美化
  • %precision:设置输出格式的浮点精度
  • %prun:通过python代码分析器运行一条语句
  • %psearch:在命名空间中通过通配符搜索对象
  • %psource:输出(或通过页面运行)对象的源代码
  • %pushd:将当前目录放在堆栈上并更改目录
  • %pwd:返回当前工作目录路径
  • %pycat:在页面中显示语法高亮的文件
  • %pylab:以交互地方式加载numpy和matplotlib
  • %qtconsole:打开连接到这个内核的qtconsole
  • %quickref:显示一个快速参考表(%magic的简化版)
  • %recall%rep:类似于复制粘贴的功能
  • %rehashx:根据$PATH中的所有可执行文件更新别名表
  • %reload_ext:根据模块名重新加载IPython扩展
  • %ren:等效于!ren,文件重命名
  • %rerun:重新运行之前的输入
  • %reset:重置命名空间
  • %reset_selective:重置命名空间的符合指定规则一部分
  • %rmdir:等效于!rmdir,文件删除
  • %run:在IPython中以程序的形式运行指定的文件
  • %save:保存多行代码或宏到指定文件
  • %sc:运行shell命令并保留输出(已弃用)
  • %set_env:设置环境变量
  • %store:python变量的轻量级持久化
  • %sx%system:运行shell命令并保留输出(简记为!!
  • %tb:输出最后的追踪结果
  • %time%timeit:输出Python语句或表达式的执行时间
  • %unalias:删除一个别名
  • %unload_ext:通过模块名卸载一个IPython扩展
  • %who:以最简略的格式打印所有可交互变量
  • %who_ls:返回所有可交互变量的排序列表
  • %whos%who的升级版,信息更丰富了
  • %xdel:深度删除一个变量
  • %xmode:切换为异常处理程序的模式

单元魔法(Cell magic)列表

  • %%!:运行shell命令并保留输出(简记为!!
  • %%HTML%%html:将单元格渲染为HTML块
  • %%SVG%%svg: 使用SVG literal渲染单元格
  • %%bash:在子进程中使用bash运行单元格
  • %%capture:运行单元格,捕获stdout、stderr和IPython回调的富文本display()
  • %%cmd:在子进程中使用cmd运行单元格
  • %%debug:激活交互式调试器
  • %%file%%writefile:将单元格的内容写入文件
  • %%javascript%%js:使用Javascript运行单元格块代码
  • %%latex:使用latex渲染单元格
  • %%markdown:使用markdown渲染单元格
  • %%perl:在子进程中使用perl运行单元格
  • %%prun:通过python代码分析器运行一条语句
  • %%pypy:在子进程中使用pypy运行单元格
  • %%python:在子进程中使用python运行单元格
  • %%python2:在子进程中使用python2运行单元格
  • %%python3:在子进程中使用python3运行单元格
  • %%ruby:在子进程中使用ruby运行单元格
  • %%script:通过shell命令运行单元格
  • %%sh:在子进程中使用sh运行单元格
  • %%sx:运行shell命令并保留输出(简记为!!
  • %%system:运行shell命令并保留输出(简记为!!
  • %time%timeit:输出Python语句或表达式的执行时间

Automagic is ON, % prefix IS NOT needed for line magics.

7 Notebook 扩展插件

Jupyter Notebook 扩展插件(nbextensions)是一些 JavaScript 模块,你可以使用它们强化 Notebook 的功能以及使用。扩展插件本质上修改了 Jupyter UI,以实现更稳健的功能。

首先通过 pip 安装 nbextensions:

pip install jupyter_contrib_nbextensions

安装完成后,启动 Jupyter。你将在Dashboard界面看到一个新选项——NBextensions。选择它之后,你会看到大量 Jupyter Notebook 扩展插件选项。

附件/Pasted image 20210919153905.png

常用插件推荐

  • Table of Contents:在notebook左侧会生成可跳转目录(非常实用)
  • Hinterland:提供更优秀的代码补全功能
  • Split Cells:拆分单元格允许开发者并排查看 2 个单元格
  • Qgrid:不使用复杂代码的情况下,探索和编辑数据,实现诸如滚动、排序和筛选等直观的控制

扩展插件文档

8 其他技巧补充

执行shell命令

  • 在 shell 命令前加一个感叹号!,Jupyter 会将其转换为 Bash
  • 还可以将 shell 命令的输出分配给 Python 变量,如下所示
# Getting the current directory. 
# The variable "X" now contains ["/home/george/github/project_1"]
X = !pwd

JupyterLab

7_software/Jupyter/JupyterLab 入门

JupyterHub

一个多用户版本的Jupyter Notebook,转为团队协作进行了优化(用户管理和权限认证、支持基于容器的集中部署、数据代码统一管理)

附件/Pasted image 20210918211312.png

JupyterHub由四个子系统组成

  • 一个基于tornado进程的Hub作为核心
  • 一个可配置的HTTP代理(node-http-proxy),用于接收来自客户端浏览器的请求
  • 由spawn监控的多用户Jupyter笔记本服务器
  • 一个身份验证类用于管理用户的系统访问权限

JupyterLab的功能

  • 中心启动一个代理
  • 默认情况下,代理将所有请求转发到Hub
  • Hub处理用户登录并按需生成单用户服务器
  • Hub配置代理将URL前缀转发给单用户notebook服务器

JupyterLab官方文档

Voilà

可以将一个Jupyter Notebook转换成一个可以共享的独立web应用程序,给读者安全的、可定制的交互式体验。Voilà可以用作独立应用程序(默认地址localhost:8866),也可以用作Jupyter服务器扩展运行(默认地址http://localhost:8888/voila)。

Voilà的运行机制

  • Voilà运行notebook中的代码,并收集输出结果
  • 收集notebook和输出结果并转化为Web页面(默认隐藏notebook中的代码单元格)
  • 生成的Web页面通过Tornado应用或者Jupyter服务进行展示
  • 当用户访问页面时,页面上的小部件可以访问底层的Jupyter内核

Voilà官方文档

nbviewer

nbviewer是一个web应用程序,通过输入一个Jupyter笔记本文件的URL,呈现该笔记本作为一个静态的HTML网页,并提供一个稳定的页面链接同来与他人共享

nbviewer原理

  • 用Python和JavaScript编写
  • 通过nbconvert工具对notebook渲染
  • 使用Tornado搭建Web服务

nbviewer特性

  • 不能支持代码,只是将 notebook文档转为web页面
  • nbviewer只能分享外网可访问的notebook URL
  • 依托于底层的nbconvert工具,nbviewer还可以将.ipynb文件转为HTML、LaTeX、PDF、Reveal JS、Markdown (md)、ReStructured Text (rst)和executable script等格式
  • nbviewer支持在个人服务器搭建

nbviewer使用页面 官方说明

Widgets

一个Jupyter小部件用于支持在Jupyter笔记本中进行交互式数据可视化 Widgets主要包括以下几个包:

ipyleaflet: 一个用于创建具有平移和缩放功能的简单交互式地图的库,支持诸如多边形、标记等注释,以及更普遍的任何geojson编码的地理数据结构。

bqplot: 一个实现图形语法结构的二维交互式数据可视化库,它提供了一个简单的API来创建自定义用户交互。

pythreejs:3-D可视化库,使用gpu进行计算加速

ipyvolume:使用WebGL为Python绘制3d绘图

nglview:以交互方式查看分子结构和轨迹

K3D-Jupyter:使用高级API(表面、等值面、体素、网格、云点、vtk对象、体积渲染器、彩色地图等)在WebGL支持下创建3D图

BeakerX:用于表、图、表单、Apache Spark等数据的交互(类似于在线Excel)

jupyter-gmaps:在Jupyter笔记本中嵌入交互式谷歌地图。使用热图、GeoJSON、符号和标记可视化数据,或绘制方向、交通或自行车路线。

widget cookiecutters:允许开发人员使用JavaScript和TypeScript生态系统的可视化库

perspective:一个用于大型、实时数据集的交互式可视化组件

Widgets可视化示例

1 其他补充

Jupyter常见错误与解决方案

Jupyter在浏览器中无法加载或工作

  • 在其他浏览器中尝试(例如,如果你通常使用Firefox,尝试使用Chrome)。这有助于确定问题所在。
  • 尝试禁用任何浏览器扩展和/或任何已安装的Jupyter扩展。
  • 一些网络安全软件可以干扰木星。如果你有安全软件,试着暂时关闭它,并在设置中寻找更长期的解决方案。
  • 在地址栏中,尝试在localhost和127.0.0.1之间进行更改。它们应该是相同的,但在某些情况下,这是不同的。

往年同期文章