作者 | 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和技巧。
- 计算完成(或失败)后播放声音
- 将通知与您的操作系统集成(为GNOME shell做好准备)
- 跳转到变量,函数或类的定义
- 为rpy2启用自动完成(非常适合ggplot2)
- 在一个漂亮的表格视图中汇总字典
- 从其他NoteBook中选择性导入
- 出错或打开NoteBook时滚动到最近执行的单元格
- 交互式(跟随)尾部,用于长输出
注意:为了使其易于使用,将下面提供的代码段收集到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等效项以保持输出合理的长度!