Jupyther notebook技巧

转自:http://www.myzaker.com/article/58212d117f780b6d7f004766/

英文版地址:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/

Jupyther notebook , 也就是一般说的 Ipython notebook,是一个可以把代码、图像、注释、公式和作图集于一处,从而实现可读性分析的一种灵活的工具。 

Jupyter 延伸性很好,支持多种编程语言,可以很轻松地安装在个人电脑或者任何服务器上——只要有 ssh 或者 http 接入就可以啦。最棒的一点是,它完全免费哦。

Jupyter 界面  

默认情况下,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.  

2. 变量的完美显示

有一点已经众所周知。把变量名称或没有定义输出结果的语句放在 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 <ipython-input-46-b52343f1a2d5>:2 ( append_if_not_exists )     10000     0.022     0.000     0.022     0.000 {method 'randint' of 'mtrand.RandomState' objects}         1     0.006     0.006     0.556     0.556 <ipython-input-46-b52343f1a2d5>:6 ( some_useless_slow_function )     6320     0.001     0.000     0.001     0.000 {method 'append' of 'list' objects}         1     0.000     0.000     0.556     0.556 <string>:1 ( <module> )         1     0.000     0.000     0.556     0.556 {built-in method exec}         1     0.000     0.000     0.000     0.000 {method 'disable' of '_lsprof.Profiler' objects}

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 )         <ipython-input-24-0f6b26649b2e> in <module> ( )               5     raise NotImplementedError ( )               6         ----> 7 pick_and_take ( )         <ipython-input-24-0f6b26649b2e> in pick_and_take ( )               3 def pick_and_take ( ) :               4     picked = numpy.random.randint ( 0, 1000 )         ----> 5     raise NotImplementedError ( )               6               7 pick_and_take ( )         NotImplementedError:         > <ipython-input-24-0f6b26649b2e> ( 5 ) pick_and_take ( )               3 def pick_and_take ( ) :               4     picked = numpy.random.randint ( 0, 1000 )         ----> 5     raise NotImplementedError ( )               6               7 pick_and_take ( )         ipdb>

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. ] ) ,         <a list of 10 Patch objects> )

In [ 6 ] : # By adding a semicolon at the end, the output is suppressed.         plt.hist ( x ) ;
16. 运行 Shell 命令

在 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 ) } $$

会变成  

18. 在 notebook 内用不同的内核运行代码

如果你想要,其实可以把不同内核的代码结合到一个 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

24. 从 Jupyter notebook 创建演示稿

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 的人,你还有这些选择:

在评论里告诉我哪些是你的最爱小窍门吧!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值