优化Jupyter Notebook:提示,技巧,nbextension,Productivity tips

2019-06-21 17:23:30 浏览数 (1)

作者 | Shadab Hussain&Michał Krassowski

来源 | Towards Data Science

编辑 | 代码医生团队

Jupyter Notebook是一种基于Web的交互式工具,机器学习和数据科学社区使用了很多。它们用于快速测试,作为报告工具,甚至是在线课程中非常复杂的学习材料。

本文列出一些快捷方式,魔术命令和nbextensions。

快捷键

按Ctrl Shift p或单击菜单栏中的小键盘图标以获取命令调色板列表

命令和编辑模式中的快捷方式:

  • Shift Enter 运行当前单元格,在下面选择
  • Ctrl Enter 运行选定的单元格
  • Alt Enter 运行当前单元格,插入下面
  • Ctrl S 保存和检查点

处于编辑模式时的快捷方式:

  • Esc 进入命令模式
  • Tab 代码完成或缩进
  • Shift Tab 提示
  • Ctrl ] 缩进
  • Ctrl [ DEDENT语言
  • Ctrl A 全选
  • Ctrl Z 后退
  • Ctrl Shift Z或Ctrl Y重做
  • Ctrl Home 单元格开始
  • Ctrl End 单元格结束
  • Ctrl Left 跳转词左边
  • Ctrl Right 跳转词右边

进入命令模式后,按 H(帮助)以获取键盘快捷键列表:

列出了一些最常用的快捷方式。通过点击确保处于命令模式Esc:

  • 使用Up和Down键向上和向下滚动单元格。
  • 按A或B在活动单元格的上方或下方插入新单元格。
  • M 将活动单元格转换为Markdown单元格。
  • Y 将活动单元格设置为代码单元格。
  • X 将切割选定的单元格
  • C 将复制选定的单元格
  • V 将粘贴正在复制/剪切的单元格
  • Shift V 贴上面的单元格
  • S 将保存NoteBook
  • F 查找/替换
  • O 将切换输出
  • D D(D两次)将删除活动单元格。
  • Z 将撤消单元格删除
  • 要一次选择多个单元格,请按住Shift并按Up或Down
  • Shift Space 向上滚动NoteBook
  • Space 向下滚动NoteBook

选择多个单元格:

  • 按Shift M合并选择
  • 要在光标处拆分活动单元格,请按Ctrl Shift -编辑模式
  • 也可以单击Shift Click单元格左侧的边距并选择它们

在NoteBook之间复制和粘贴单元格:

  • NoteBook1: - 按住Shift键并选中Ctrl c要复制的多个单元格
  • NoteBook2: - 点击Esc进入命令模式Ctrl v进行粘贴

使用在当前内核中安装软件包 ! pip install <package>

通过在$符号前面添加shell命令中的Python变量:

魔术命令

Magic Commands是一种快捷方式,可显着扩展NoteBook的功能

从NoteBook中共享代码示例:

  • 使用%pastebin魔术功能选择一系列单元格
  • Jupyter提供了一个秘密URL来共享

注意 - 此链接将在7天后过期

要获得已定义变量的列表,请使用%whos或%who_ls

  • %whos 显示变量类型以及一些额外信息:大小,内容等。
  • %who_ls 仅显示变量名称

使用Jupyter Notebook中的外部文件:

  • %pycat file.py ➡在寻呼机中打开脚本
  • %load file.py ➡将脚本插入单元格
  • %run file.py ➡运行脚本
  • %run file.ipynb ➡运行NoteBook
  • %notebook filename ➡将当前的IPython历史记录导出到NoteBook文件

获取,设置或列出环境变量:

  • %env ➡列出所有环境变量
  • %env var ➡获取var的值
  • %env var val➡为var设定值

在shell中运行命令:

%system ➡使用shell(主要用于获取当前目录,日期等)

使用以下方法将NoteBook自动保存到其检查点%autosave :

每120秒自动保护(2分钟)

执行不同的语言:

  • %%HTML ➡执行HTML代码
  • %%perl ➡在子进程中执行Perl
  • %%javascript或%%js➡执行Javascript代码块
  • %%python3 ➡在子进程中使用python3执行代码
  • %%ruby ➡执行Ruby代码

其他魔术命令:

  • %history ➡打印输入历史记录
  • %lsmagic ➡列出当前可用的魔术功能
  • %magic ➡打印有关魔术功能系统的信息
  • %matplotlib ➡设置matplotlib以交互方式工作
  • %pwd ➡返回当前工作目录
  • %quickref ➡显示快速参考表
  • %time ➡时间执行Python语句或表达式

nbextensions

此扩展的好处是它更改了默认值。

要安装nbextensions,请在Anaconda Prompt中执行以下命令:

代码语言:javascript复制
conda install -c conda-forge jupyter_contrib_nbextensions

conda install -c conda-forge jupyter_nbextensions_configurator

也可以使用pip安装nbextensions:

  • pip show jupyter_contrib_nbextensions
  • 运行pip show jupyter_contrib_nbextensions以查找安装NoteBook扩展的位置
  • 运行jupyter contrib nbextensions install以安装新扩展

安装完成后,重新启动Jupyter NoteBook,然后可以观察到添加到菜单中的新选项卡Nbextensions

同样的nbextension也可以位于“编辑”菜单中:

现在看看一些nbextensions:

1. Hinterland - 它为代码单元中的每个按键启用代码自动完成菜单,而不是仅使用选项卡启用它

2. Split Cells Notebook - 在Jupyter NoteBook中启用拆分单元格

进入命令模式(Esc),用于Shift s将当前单元格切换为拆分单元格或全宽度。

3. 目录 - toc扩展可以收集所有正在运行的标题,并将它们显示在浮动窗口中,作为侧边栏或导航菜单。该扩展还具有可拖动,可调整大小,可折叠,可停靠的功能,并具有自动编辑功能,具有独特的链接ID和可选的toc单元格。

4. Autopep8 -使用特定于内核的代码重新格式化/美化代码单元格的内容

5. Snippets - 添加一个下拉菜单,将片段单元格插入当前NoteBook中。

Jupyter NoteBook主题

可以从Jupyter Notebook的默认主题转换为Dark模式。

为实现这一目标,需要安装jupyterthemes :

jt -l 将提供可用主题列表

jt -t <theme name>将改变主题。让尝试使用chesterish主题将其更改为黑暗模式。

jt -r 将其恢复为默认主题

Productivity tips

想方设法改善工作中最重要的工具:Jupyter Notebook / Jupyter Lab,收集了所有hacks和技巧。

  1. 计算完成(或失败)后播放声音
  2. 将通知与您的操作系统集成(为GNOME shell做好准备)
  3. 跳转到变量,函数或类的定义
  4. 为rpy2启用自动完成(非常适合ggplot2)
  5. 在一个漂亮的表格视图中汇总字典
  6. 从其他NoteBook中选择性导入
  7. 出错或打开NoteBook时滚动到最近执行的单元格
  8. 交互式(跟随)尾部,用于长输出

注意:为了使其易于使用,将下面提供的代码段收集到Python3包(jupyter-helpers)中。

https://github.com/krassowski/jupyter-helpers

可以得到它:

代码语言:javascript复制
pip3 install jupyter_helpers

希望获得最佳体验,强烈建议使用这些依赖项:

代码语言:javascript复制
pip3 install ipywidgets

jupyter labextension install @jupyter-widgets/jupyterlab-manager

1.计算完成后播放声音

如果单元格(或单元格链)的执行时间超过几秒,可以将Jupyter配置为播放声音。可以用两种方法:一个基于Python的,和一个基于JavaScrip的。

https://stackoverflow.com/a/50648266/6646912

https://stackoverflow.com/a/50569680/6646912

python的代码大致如下:

代码语言:javascript复制
from time import time

from IPython import get_ipython

from IPython.display import Audio, display



class Beeper:



    def __init__(self, threshold, **audio_kwargs):

        self.threshold = threshold

        self.start_time = None    # time in sec, or None

        self.audio = audio_kwargs



    def pre_execute(self):

        if not self.start_time:

            self.start_time = time()



    def post_execute(self):

        end_time = time()

        if self.start_time and end_time - self.start_time > self.threshold:

            audio = Audio(**self.audio, autoplay=True)

            display(audio)

        self.start_time = None



beeper = Beeper(5, filename='beep-07.wav')



ipython = get_ipython()

ipython.events.register('pre_execute', beeper.pre_execute)

ipython.events.register('post_execute', beeper.post_execute)

帮助程序包有一个升级版本,它负责隐藏音频播放器和许多其他东西。可以这样使用它:

代码语言:javascript复制
from jupyter_helpers.notifications import Notifications

Notifications(Selectively import from other notebooks

     success_audio='path/to/beep-07.wav', time_threshold=2

)

在上面的例子中,使用beep-07.wav。

https://www.soundjay.com/beep-sounds-1.html

在异常时播放喇叭声

同样可以添加一个hook,以便在引发异常时播放不同的声音。这是Kevin在SO提出的一个非常简单的机制:

https://stackoverflow.com/a/41603739/6646912

代码语言:javascript复制
# CC-BY-SA 4.0 Kevin (https://stackoverflow.com/a/41603739/6646912)

# https://creativecommons.org/licenses/by-sa/4.0/

from IPython.display import Audio, display



def play_sound(self, etype, value, tb, tb_offset=None):

    self.showtraceback((etype, value, tb), tb_offset=tb_offset)

    display(Audio(url='http://www.wav-sounds.com/movie/austinpowers.wav', autoplay=True))



get_ipython().set_custom_exc((ZeroDivisionError,), play_sound)

更先进的一个是jupyter_helpers包的一部分:

代码语言:javascript复制
from jupyter_helpers.notifications import Notifications

Notifications(failure_audio='path/to/beep-05.wav')

2.将通知与操作系统集成

在图书馆工作时,需要一个哔哔声和喇叭声的替代品。Notify-send使我成为一个完美的工具,作为一个主要的GNOME用户(向下滚动以获取其他桌面环境的说明)。

设置使用:

代码语言:javascript复制
from jupyter_helpers.notifications import Notifications

Notifications(

    success_audio='path/to/beep-07.wav', time_threshold=2,

    failure_audio='path/to/beep-05.wav',

    integration='GNOME'

)

这对GNOME用户来说是开箱即用的,虽然安装一个名为的替代品notify-send.sh会使通知在不再需要时消失。这可以使用附加的setup.sh脚本完成。

图1:完全集成的通知

操作系统集成已准备好为任何其他桌面环境挂钩,但它需要一些脚本:

代码语言:javascript复制
from jupyter_helpers.desktop_integration import DesktopIntegration

class WindowsIntegration(DesktopIntegration):

    def notify(self, title, text, notify_id=None, **kwargs):

        pass   # add your code here

    def notify_close(self, notify_id):

        pass   # add your code here

Notifications(

    success_audio='path/to/beep-07.wav', time_threshold=2,

    failure_audio='path/to/beep-05.wav',

    integration=WindowsIntegration

)

如果希望将其与操作系统集成,请考虑发送PR。

3.跳转到变量/函数/类的定义

使用Alt click可以使用鼠标跳转到定义,或者使用Ctrl Alt B仅限键盘替换jupyterlab-go-to-definition扩展名:

https://github.com/krassowski/jupyterlab-go-to-definition

跳转到定义支持Python和R. PRs支持其他语言是受欢迎的

最后,使用Alt o跳回以前的位置:

对于具有更长输出的笔记本电脑,跳回的能力非常有用

要安装扩展程序,请使用:

代码语言:javascript复制
jupyter labextension install @krassowski/jupyterlab_go_to_definition

4.启用rpy2的自动完成功能(ggplot2!)

如果工作更多是关于出版物而不是交互式仪表板,那很可能熟悉ggplot2。虽然有一些很棒的项目,比如plotnine试图将它移植到Python,但仍然发现在使用rpy2 R-Python接口时,使用ggplot(特别是扩展)功能更加完善。

但是%%R到目前为止,单元格中的自动完成不包括R对象(如果已加载,也不包括ggplot函数)。准备了一个简单的解决方法:

代码语言:javascript复制
from rpy2.robjects import r

from IPython import get_ipython



def rpy2_completer(ipython, event):

    query = event.line.strip().split()[-1]

    suggestions = []

    all_r_symbols = r('sapply(search(), ls)')

    for environment, symbols in all_r_symbols.items():

        for _, symbol in symbols.items():

            if symbol.startswith(query):

                suggestions.append(symbol)

    return suggestions



get_ipython().set_hook('complete_command', rpy2_completer, re_key='.*')

如将在本GitHub问题中讨论,将来可能会有所改进。

https://github.com/jupyter/notebook/issues/2528#issuecomment-466499454

自动完成现在还包括R对象和ggplot函数

再次,一个简单的导入jupyter_helpers将解决问题:

代码语言:javascript复制
from jupyter_helpers import rpy2_autocompletion

5.在一个漂亮的表格视图中汇总字典

这是基于Python3 SimpleNamespace,但是使用Jupyter的pandas和numpy-aware HTML表示扩展它:

代码语言:javascript复制
from jupyter_helpers.namespace import NeatNamespace

NeatNamespace(your_dict)

将修剪长集合,当浏览器难以渲染意外打印的字典时,无需担心空间或内存不足。水平和垂直方向可用于更好的空间利用。

带有HTML的命名空间:在转换为DataFrame之前需要查看嵌套数据时

6.从其他NoteBook中选择性地导入

一段时间,试图跟随数据/方法/结果的分离,其具有用于每个较大分析3个Jupyter NoteBook:data.ipynb,methods.ipynb和results.ipynb。为了节省无用的重新计算某些东西的时间,从数据和方法NoteBook中选择性地导入,以便在结果NoteBook中使用。

现在可以(使用nbimporter构建)使用一个导入和一个魔法:

https://github.com/grst/nbimporter

在这个SO线程中描述了这一点,希望看到一些建议。

https://stackoverflow.com/questions/54317381/selectively-import-from-another-jupyter-notebook

7.滚动到最近执行的单元格

之前显示的Notifications类使得NoteBook向下滚动,导致违规单元格异常(图1)。可以通过传递禁用scroll_to_exceptions=False。

如果反过来想要更多自动滚动,可以使用底层帮助函数来标记在晚上结束使用的单元格,以便在早上快速打开NoteBook:

代码语言:javascript复制
from jupyter_helpers.utilities import scroll_to_current_cell

scroll_to_current_cell(preserve=True)

8.交互式尾部,用于长输出

当运行第三方应用程序(但不是构建一个完全成熟的管道)时,可能只想看到当前正在运行的进程的尾部。在bash中,很容易实现使用tail -f。

观看输出的需要以及放慢计算机速度的问题,那么FollowingTail可以帮助您:

应用tail -f等效项以保持输出合理的长度!

0 人点赞