Jupyter Notebook 的 27 个窍门,技巧和快捷键
翻译 | 姜范波 校对 | 毛丽 & 寒小阳
Jupyther notebook , 也就是一般说的 Ipython notebook,是一个可以把代码、图像、注释、公式和作图集于一处,从而实现可读性分析的一种灵活的工具。
Jupyter 延伸性很好,支持多种编程语言,可以很轻松地安装在个人电脑或者任何服务器上——只要有 ssh 或者 http 接入就可以啦。最棒的一点是,它完全免费哦。
默认情况下,Jupyter Notebook 使用 Python 内核,这就是为什么它原名 IPython Notebook。Jupyter notebook 是 Jupyter 项目的产物—— Jupyter 这个名字是它要服务的三种语言的缩写:Julia,PYThon 和 R,这个名字与 " 木星(jupiter)" 谐音。本文将介绍 27 个轻松使用 Jupyter 的小窍门和技巧。
1. 快捷键
高手们都知道,快捷键可以节省很多时间。Jupyter 在顶部菜单提供了一个快捷键列表:Help > Keyboard Shortcuts 。每次更新 Jupyter 的时候,一定要看看这个列表,因为不断地有新的快捷键加进来。另外一个方法是使用 Cmd + Shift + P ( Linux 和 Windows 下 Ctrl + Shift + P 亦可 ) 调出命令面板。这个对话框可以让你通过名称来运行任何命令——当你不知道某个操作的快捷键,或者那个操作没有快捷键的时候尤其有用。这个功能与苹果电脑上的 Spotlight 搜索很像,一旦开始使用,你会欲罢不能。
Esc + F 在代码中查找、替换,忽略输出。
Esc + O 在 cell 和输出结果间切换。
选择多个 cell:
Shift + J 或 Shift + Down 选择下一个 cell。
Shift + K 或 Shift + Up 选择上一个 cell。
一旦选定 cell,可以批量删除 / 拷贝 / 剪切 / 粘贴 / 运行。当你需要移动 notebook 的一部分时这个很有用。
Shift + M 合并 cell.
有一点已经众所周知。把变量名称或没有定义输出结果的语句放在 cell 的最后一行,无需 print 语句,Jupyter 也会显示变量值。当使用 Pandas DataFrames 时这一点尤其有用,因为输出结果为整齐的表格。
鲜为人知的是,你可以通过修改内核选项 ast_note_interactivity,使得 Jupyter 对独占一行的所有变量或者语句都自动显示,这样你就可以马上看到多个语句的运行结果了。
In [ 1 ] : from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
In [ 2 ] : from pydataset import data
quakes = data ( 'quakes' )
quakes.head ( )
quakes.tail ( )
Out [ 2 ] :
lat long depth mag stations
1 -20.42 181.62 562 4.8 41
2 -20.62 181.03 650 4.2 15
3 -26.00 184.10 42 5.4 43
4 -17.97 181.66 626 4.1 19
5 -20.42 181.96 649 4.0 11
996 -25.93 179.54 470 4.4 22
997 -12.28 167.06 248 4.7 35
998 -20.13 184.20 244 4.5 34
999 -17.40 187.80 40 4.5 14
1000 -21.59 170.56 165 6.0 119
如果你想在各种情形下(Notebook 和 Console)Jupyter 都同样处理,用下面的几行简单的命令创建文件 ~/.ipython/profile_default/ipython_config.py 即可实现:
c = get_config ( )
# Run all nodes interactively
c.InteractiveShell.ast_node_interactivity = "all"
3. 轻松链接到文档
在 Help 菜单下,你可以找到常见库的在线文档链接,包括 Numpy,Pandas,Scipy 和 Matplotlib 等。
另外,在库、方法或变量的前面打上 ?,即可打开相关语法的帮助文档。
In [ 3 ] : ?str.replace ( )
Docstring: S.replace ( old, new [ , count ] ) -> str Return a copy of S with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced. Type: method_descriptor
4. 在 notebok 里作图
在 notebook 里作图,有多个选择:
- (事实标准)(http://matplotlib.org/),可通过 %matplotlib inline 激活,
- %matplotlib notebook 提供交互性操作,但可能会有点慢,因为响应是在服务器端完成的。
- 提供 matplotlib 代码的替代性呈现(通过 d3),虽然不完整,但很好。
- 生成可交互图像的更好选择。
- 可以生成非常好的图,可惜是付费服务。
5.Jupyter Magic 命令
上文提到的 %matplotlib inline 是 Jupyter Magic 命令之一。
推荐阅读
,它一定会对你很有帮助。下面是我最爱的几个:
6.Jupyter Magic-%env: 设置环境变量
不必重启 jupyter 服务器进程,也可以管理 notebook 的环境变量。有的库(比如 theano)使用环境变量来控制其行为,%env 是最方便的途径。
In [ 55 ] : # Running %env without any arguments # lists all environment variables # The line below sets the environment # variable OMP_NUM_THREADS %env OMP_NUM_THREADS=4
env: OMP_NUM_THREADS=4
7.Jupyter Magic-%run: 运行 python 代码
%run 可以运行 .py 格式的 python 代码——这是众所周知的。不那么为人知晓的事实是它也可以运行其它的 jupyter notebook 文件,这一点很有用。
注意:使用 %run 与导入一个 python 模块是不同的。
In [ 56 ] : # this will execute and show the output from # all code cells of the specified notebook %run ./two-histograms.ipynb
8.Jupyter Magic-%load:从外部脚本中插入代码
该操作用外部脚本替换当前 cell。可以使用你的电脑中的一个文件作为来源,也可以使用 URL。
In [ ] : # Before Running %load ./hello_world.pyIn [ 61 ] : # After Running # %load ./hello_world.py if __name__ == "__main__": print ( "Hello World!" )
Hello World!
9.Jupyter Magic-%store:在 notebook 文件之间传递变量
%store 命令可以在两个 notebook 文件之间传递变量。
In [ 62 ] : data = 'this is the string I want to pass to different notebook' %store data del data # This has deleted the variable
Stored 'data' ( str )
现在,在一个新的 notebook 文档里……
In [ 1 ] : %store -r data print ( data )
this is the string I want to pass to different notebook
10.Jupyter Magic-%who:列出所有的全局变量
不加任何参数, %who 命令可以列出所有的全局变量。加上参数 str 将只列出字符串型的全局变量。
In [ 1 ] : one = "for the money" two = "for the show" three = "to get ready now go cat go" %who str
one three two
11.Jupyter Magic- 计时
有两种用于计时的 jupyter magic 命令: %%time 和 %timeit. 当你有一些很耗时的代码,想要查清楚问题出在哪时,这两个命令非常给力。
仔细体会下我的描述哦。
%%time 会告诉你 cell 内代码的单次运行时间信息。
In [ 4 ] : %%time import time for _ in range ( 1000 ) : time.sleep ( 0.01 ) # sleep for 0.01 seconds
CPU times: user 21.5 ms, sys: 14.8 ms, total: 36.3 ms Wall time: 11.6 s
%%timeit 使用了 Python 的 timeit 模块,该模块运行某语句 100,000 次(默认值),然后提供最快的 3 次的平均值作为结果。
In [ 3 ] : import numpy %timeit numpy.random.normal ( size=100 )
The slowest run took 7.29 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 5.5 µ s per loop
12.Jupyter Magic-writefile and %pycat: 导出 cell 内容 / 显示外部脚本的内容
使用 %%writefile magic 可以保存 cell 的内容到外部文件。 而 %pycat 功能相反,把外部文件语法高亮显示(以弹出窗方式)。
In [ 7 ] : %%writefile pythoncode.py import numpy def append_if_not_exists ( arr, x ) : if x not in arr: arr.append ( x ) def some_useless_slow_function ( ) : arr = list ( ) for i in range ( 10000 ) : x = numpy.random.randint ( 0, 10000 ) append_if_not_exists ( arr, x )
Writing pythoncode.py
In [ 8 ] : %pycat pythoncode.py
import numpy def append_if_not_exists ( arr, x ) : if x not in arr: arr.append ( x ) def some_useless_slow_function ( ) : arr = list ( ) for i in range ( 10000 ) : x = numpy.random.randint ( 0, 10000 ) append_if_not_exists ( arr, x )
13.Jupyter Magic-%prun:告诉你程序中每个函数消耗的时间
使用 %prun+ 函数声明会给你一个按顺序排列的表格,显示每个内部函数的耗时情况,每次调用函数的耗时情况,以及累计耗时。
In [ 47 ] : %prun some_useless_slow_function ( )
26324 function calls in 0.556 seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno ( function ) 10000 0.527 0.000 0.528 0.000
14.Jupyter Magic- 用 %pdb 调试程序
Jupyter 有自己的调试界面,使得进入函数内部检查错误成为可能。
Pdb 中可使用的命令见
In [ ] : %pdb def pick_and_take ( ) : picked = numpy.random.randint ( 0, 1000 ) raise NotImplementedError ( ) pick_and_take ( ) Automatic pdb calling has been turned ON --------------------------------------------------------------------------- NotImplementedError Traceback ( most recent call last )
15. 末句函数不输出
有时候不让末句的函数输出结果比较方便,比如在作图的时候,此时,只需在该函数末尾加上一个分号即可。
In [ 4 ] : %matplotlib inline from matplotlib import pyplot as plt import numpy x = numpy.linspace ( 0, 1, 1000 ) **1.5In [ 5 ] : # Here you get the output of the function plt.hist ( x ) Out [ 5 ] : ( array ( [ 216., 126., 106., 95., 87., 81., 77., 73., 71., 68. ] ) , array ( [ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ] ) , )
在 notebook 内部运行 shell 命令很简单,这样你就可以看到你的工作文件夹里有哪些数据集。
In [ 7 ] : !ls *.csv
nba_2016.csv titanic.csvpixar_movies.csv whitehouse_employees.csv
17. 用 LaTex 写公式
当你在一个 Markdown 单元格里写 LaTex 时,它将用 MathJax 呈现公式:如
$$ P ( A mid B ) = frac{P ( B mid A ) , P ( A ) }{P ( B ) } $$
会变成
如果你想要,其实可以把不同内核的代码结合到一个 notebook 里运行。
只需在每个单元格的起始,用 Jupyter magics 调用 kernal 的名称:
%%bash
%%HTML
%%python2
%%python3
%%ruby
%%perl
In [ 6 ] : %%bash for i in {1..5} do echo "i is $i" done
i is 1 i is 2 i is 3 i is 4 i is 5
19. 给 Jupyter 安装其他的内核
Jupyter 的优良性能之一是可以运行不同语言的内核。下面以运行 R 内核为例说明:
简单的方法:通过 Anaconda 安装 R 内核
conda install -c r r-essentials
稍微麻烦的方法:手动安装 R 内核
如果你不是用 Anaconda,过程会有点复杂,首先,你需要从 CRAN 安装 R。
之后,启动 R 控制台,运行下面的语句:
install.packages ( c ( 'repr', 'IRdisplay', 'crayon', 'pbdZMQ', 'devtools' ) ) devtools::install_github ( 'IRkernel/IRkernel' ) IRkernel::installspec ( ) # to register the kernel in the current R installation
20. 在同一个 notebook 里运行 R 和 Python
要这么做,最好的方法事安装 rpy2(需要一个可以工作的 R),用 pip 操作很简单:
pip install rpy2
然后,就可以同时使用两种语言了,甚至变量也可以在二者之间公用:
In [ 1 ] : %load_ext rpy2.ipythonIn [ 2 ] : %R require ( ggplot2 ) Out [ 2 ] : array ( [ 1 ] , dtype=int32 ) In [ 3 ] : import pandas as pd df = pd.DataFrame ( { 'Letter': [ 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c' ] , 'X': [ 4, 3, 5, 2, 1, 7, 7, 5, 9 ] , 'Y': [ 0, 4, 3, 6, 7, 10, 11, 9, 13 ] , 'Z': [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ] } ) In [ 4 ] : %%R -i df ggplot ( data = df ) + geom_point ( aes ( x = X, y= Y, color = Letter, size = Z ) )
21. 用其他语言写函数
有时候 numpy 的速度有点慢,我想写一些更快的代码。
原则上,你可以在动态库里编译函数,用 python 来封装…
但是如果这个无聊的过程不用自己干,岂不更好?
你可以在 cython 或 fortran 里写函数,然后在 python 代码里直接调用。
首先,你要先安装:
!pip install cython fortran-magic In [ ] : %load_ext CythonIn [ ] : %%cython def myltiply_by_2 ( float x ) : return 2.0 * xIn [ ] : myltiply_by_2 ( 23. )
我个人比较喜欢用 Fortran,它在写数值计算函数时十分方便。更多的细节在。
In [ ] : %load_ext fortranmagicIn [ ] : %%fortran subroutine compute_fortran ( x, y, z ) real, intent ( in ) :: x ( : ) , y ( : ) real, intent ( out ) :: z ( size ( x, 1 ) ) z = sin ( x + y ) end subroutine compute_fortranIn [ ] : compute_fortran ( [ 1, 2, 3 ] , [ 4, 5, 6 ] )
还有一些别的跳转系统可以加速 python 代码。更多的例子见(http://arogozhnikov.github.io/2015/09/08/SpeedBenchmarks.html)
你可以在 cython 或 fortran 里写函数,然后在 python 代
22. 支持多指针
Jupyter 支持多个指针同步编辑,类似 Sublime Text 编辑器。按下 Alt 键并拖拽鼠标即可实现。
23.Jupyter 外界拓展
是一些给予 Jupyter 更多更能的延伸程序,包括 jupyter spell-checker 和 code-formatter 之类 .
下面的命令安装这些延伸程序,同时也安装一个菜单形式的配置器,可以从 Jupyter 的主屏幕浏览和激活延伸程序。
!pip install https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tarball/master!pip install jupyter_nbextensions_configurator!jupyter contrib nbextension install --user!jupyter nbextensions_configurator enable --user
Damian Avila 的允许你从已有的 notebook 创建一个 powerpoint 形式的演示稿。
你可以用 conda 来安装 RISE:
conda install -c damianavila82 rise
或者用 pip 安装:
pip install RISE
然后运行下面的代码来安装和激活延伸程序:
jupyter-nbextension install rise --py --sys-prefixjupyter-nbextension enable rise --py --sys-prefix
25.Jupyter 输出系统
Notebook 本身以 HTML 的形式显示,单元格输出也可以是 HTML 形式的,所以你可以输出任何东西:视频 / 音频 / 图像。
这个例子是浏览我所有的图片,并显示前五张图的缩略图。
In [ 12 ] : import os from IPython.display import display, Image names = [ f for f in os.listdir ( '../images/ml_demonstrations/' ) if f.endswith ( '.png' ) ] for name in names [ :5 ] : display ( Image ( '../images/ml_demonstrations/' + name, width=100 ) )
我们也可以用 bash 命令创建一个相同的列表,因为 magics 和 bash 运行函数后返回的是 python 变量:
In [ 10 ] : names = !ls ../images/ml_demonstrations/*.png names [ :5 ] Out [ 10 ] : [ '../images/ml_demonstrations/colah_embeddings.png', '../images/ml_demonstrations/convnetjs.png', '../images/ml_demonstrations/decision_tree.png', '../images/ml_demonstrations/decision_tree_in_course.png', '../images/ml_demonstrations/dream_mnist.png' ]
26. 大数据分析
很多方案可以解决查询 / 处理大数据的问题:
27. 分享 notebook
分享 notebook 最方便的方法是使用 notebook 文件(.ipynb),但是对那些不使用 notebook 的人,你还有这些选择:
在评论里告诉我哪些是你的最爱小窍门吧!
原文链接:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/