原题 | Tutorial: Advanced Jupyter Notebookshtml
做者 | Benjamin Prykepython
译者 | kbsc13("算法猿的成长"公众号做者)git
原文 | www.dataquest.io/blog/advanc…github
声明 | 翻译是出于交流学习的目的,欢迎转载,但请保留本文出于,请勿用做商业或者非法用途算法
上次介绍了Jupyter 入门教程,此次介绍更多 Jupyter notebook 的使用技巧。sql
本文主要介绍如下内容:shell
shell
命令和方便的魔法命令,包括 debug,计时以及执行多种语言;logging
、macros
、运行外部代码以及 Jupyter 的拓展插件;Seaborn
模块的图表,经过命令行运行,以及使用数据库。在 notebook 中能够直接采用 shell
命令,只须要在 code cell
中,以 !
开头的都会被当作一个 shell
命令,这在处理数据或者文件,管理 Python 包的时候很是有用。如下是一个简单的示例:数据库
此外,也能够经过添加 $
命令在 shell
命令中加入 Python 的变量,以下所示:编程
因为 !
开头的命令在执行完成后就会被丢弃,所以像 cd
这样的命令是没有效果的。不过,IPython 的魔法命令提供了一个解决方法。bash
魔法命令是内建于 IPython 核中的很是方便有用的命令,它们专门用于处理特定的任务。它们虽然看起来相似 unix
命令,但实际都是经过 Python
实现的。魔法命令很是多,但在本文中仅介绍其中一部分魔法命令。
魔法命令也分两种:
从名字就能够知道,主要是根据其做用范围划分,有的在单行内执行,有的能够做用多行或者整个单元内。
想了解可用的魔法命令,能够输入命令 %lsmagic
,输出结果以下所示,能够看到确实分为 line
和 cell
两类,而且分别给出命令的数量。
若是想具体了解这些命令的做用,能够上官网查看--ipython.readthedocs.io/en/stable/i…
行魔法命令和单元魔法命令的使用形式也是不一样的,行魔法命令是以 %
开头,而单元魔法命令则是 %%
开头。
实际上 !
开头是用于 shell
命令的一种比较复杂的魔法语法,以前说的没法采用相似 cd
的命令,能够采用魔法命令实现,即 %cd
、%alias
、%env
。
下面介绍更多的例子。
首先是 %autosave
命令能够决定 notebook
自动保存的时间间隔,使用例子以下所示,命令后添加时间间隔参数,单位是秒。
%autosave 60
复制代码
输出结果:
Autosaving every 60 seconds
复制代码
在数据科学中最经常使用的一个行魔法命令就是 %matplotlib
,它能够用于显示 matplotlib
的图表,使用例子以下:
%matplotlib inline
复制代码
加上参数 inline
能够确保在一个单元内显示 Matplotlib
的图表。一般须要在导入 Matplotlib
前就采用这个行魔法命令,一般都会放在第一个代码单元内。
一般咱们都须要考虑代码的执行时间,在 notebook 中能够有两个时间魔法命令 %time
和 %timeit
,它们都有行和单元两种模式
对于 %time
,使用例子以下所示:
%timeit
和 %time
的区别在于,它会对给定代码运行屡次,并计算一个平均时间,能够经过添加参数 -n
来指定运行的次数,若是没有指定,则会自动选择一个最佳的数量。例子以下所示:
在 Jupyter notebook 中能够执行不一样的编程语言,尽管选择的核有既定的语言,好比本文例子选择的就是 Python3
,但经过魔法命令能够执行不一样的编程语言,在 %lsmagic
的输出结果也能够找到。
下面是一些使用的例子,包括执行 HTML 语言,以及用于显示数学公式的 LaTeX 语言。
固然还能够执行其余编程语言,包括 Ruby
、markdown
、JavaScript
、R
等等。
在 Jupyter 中有自定义了如何输出错误信息的方法,它能够经过导入 logging
模块实现。
如上图所示,对于错误信息,会高亮显示。
另外,logging
模块的输出和 print
以及标准的单元输出是分开的,以下图所示:
之因此会出现上图的缘由是 Jupyter notebook 会监听标准的输出流,stdout
和 stderr
,但 print
和单元输出默认是输出 stdout
,而 logging
则是经过 stderr
输出。
所以,咱们能够对 logging
进行配置来显示 stderr
的其余类型的信息,好比下图就显示了 INFO
和 DEBUG
类型的信息。
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.info('This is some information')
logging.debug('This is a debug message')
复制代码
还能够自定义信息的输出格式:
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
formater = logging.Formatter('%(levelname)s: %(message)s')
handler.setFormatter(formater)
logger.handlers = [handler]
logging.error('An error')
logging.warning('An warning')
logging.info('An info')
复制代码
注意,若是每次运行一个单元内包含代码 logger.addHandler(handler)
来添加一个新的 stream handler
,那么每次输出都会多一行额外的信息。咱们能够将对日志的配置放在单独的一个单元内,或者就如同上述所示代码,即直接代替全部如今的 handler
,不采用 addHandler
,而是 logger.handlers = [handler]
。这种作法能够移除默认的 handler
。
固然也能够将日志信息保存到文件中,代码以下所示,采用 FileHandler
而非 StreamHandler
。
handler = logging.FileHandler(filename='important_log.log', mode='a')
复制代码
最后,这里采用的日志跟经过 %config Application.log_level='INFO'
设置的日志等级是不相同的,经过 %config
配置的是 Jupyter 输出到当前运行 Jupyter 的终端上的日志信息。
Jupyter 是一个开源的工具,所以有不少开发者开发了不少拓展插件,具体能够查看:
在后面介绍的使用数据库,就采用了插件 ipython-sql
,还有就是包含了拼写检查、代码折叠等等功能的一个拓展插件 Github:
安装这些插件能够经过下面的命令
pip install ipython-sql
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable spellchecker/main
jupyter nbextension enable codefolding/main
复制代码
Jupyter notebook 的最多见的一种应用就是用于绘制图表。但 Python 的最多见绘图库 Matplotlib
在 Jupyter 中并未能给出很吸引人的结果,这能够经过 Seaborn
进行美化并添加一些额外的功能。
若是没有安装 seaborn
,能够经过命令 pip install seaborn
,或者在 jupyter 中,根据开始介绍的 shell
命令执行方式--!pip install seaborn
,安装完后,就能够先导入必须的库和数据:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
data = sns.load_dataset("tips")
复制代码
经过 seaborn
提供的简单的数据集,这里采用的 tips
是一个 pandas
的 DataFrame
格式数据集,内容是来自一个酒吧或者饭店的帐单信息。
经过 data.head()
能够展现前 5 条数据,并查看属性信息。
采用 Matplotlib
绘制 total_bill
和 tip
的关系图:
plt.scatter(data.total_bill, data.tip);
复制代码
添加 Seaborn
也是很简单,以下所示,经过 seaborn
设置了一个 darkgrid
的样式
sns.set(style="darkgrid")
plt.scatter(data.total_bill, data.tip);
复制代码
seaborn
总共有 5 种样式:darkgrid, whitegrid, dark, white, and ticks
。
实际上咱们也能够单独采用 seaborn
的绘图函数,以下所示:
sns.scatterplot(x="total_bill", y="tip", data=data);
复制代码
上图能够添加每一个坐标的标题信息以及对每一个数据点有一个提高的标记。Seaborn
还能够自动根据数据的类型进行划分,便可以再添加一个维度,这里咱们能够再添加属性 smoker
做为参数 hue
,表示数据点的颜色:
sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=data);
复制代码
添加 smoker
后,咱们能够看到每一个数据点都根据是否划分为两种颜色的数据点,展现的信息就更加丰富了。咱们再进一步,加入属性 size
做为颜色的划分,而 smoker
做为样式,以下所示:
sns.scatterplot(x="total_bill", y="tip", hue="size", style="smoker", data=data);
复制代码
seaborn
能够绘制更多更好看的图表,更多的例子能够查看其官网:
seaborn.pydata.org/examples/in…
不少时候,咱们可能会重复作相同的任务,好比每次建立一个新的 notebook,都须要导入相同的一堆第三方库,对每一个数据集都进行的统计方法,或者绘制相同类型的图表。
在 Jupyter 里能够将一些代码片断保存为可执行的宏命令,而且能用在全部的 notebooks 里。这种操做可能对其余阅读使用你的 notebook 的人来讲并非很友好的方式,但对你来讲,确实会是很是方便以及减轻工做量的方法。
宏命令也是代码,所以也能够包含变量。下面开始介绍示例
首先是写好一个代码单元,主要做用就是输出 Hello, name!
,其中 name
也是定义好的一个变量,而后利用命令 %macro
来保存宏命令,名字是 __hello_world
,而 28
表示的就是上一个运行顺序为 28
的代码单元,即 In [28]
对应的代码单元,而后 %store
是保存宏命令。
载入宏命令的操做以下,仍是采用命令 %store
,但须要加上参数 -r
,以及宏命令的名字。
若是修改在宏命令中采用的变量,其输出结果也会改变:
name = 'Ben'
__hello_world
复制代码
输出结果:
Hello, Ben!
复制代码
宏命令还能够实现更多的操做,具体仍是能够查看官网。
在 Jupyter 还能够加载和运行外部代码,也就是 .py
代码文件。这里须要采用的命令分别是 %load
和 %run
。
咱们先建立一个新的代码文件--imports.py
,其包含内容以下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
复制代码
而后在 jupyter 中加载该代码文件:
%load imports.py
复制代码
运行结果以下:
接着咱们建立一个新的代码文件--triangle_hist.py
,代码以下,绘制一个三角形直方图。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")
if __name__ == '__main__':
h = plt.hist(np.random.triangular(0, 5, 9, 1000), bins=100, linewidth=0)
plt.show()
复制代码
而后调用命令 %run
运行:
此外,还能够传递参数给脚本,只须要在代码文件名后添加便可,好比 %run my_file.py 0 "Hello, World!"
,或者是传递变量名,如 %run $filename {arg0} {arg1}
,还能够添加 -p
来经过 Python
的分析器运行代码,具体能够参考下面两个 stackoverflow
上的回答:
Jupyter notebook 最强大的做用是其交互式的流程,但它也能够在非交互式的模式下运行,便可以经过脚本或者命令行形式运行 jupyter notebook。
命令行的基本语法以下:
jupyter nbconvert --to <format> notebook.ipynb
复制代码
其中 nbconvert
是用于将 notebook 转换为其余形式的一个 API 接口,好比 PDF、HTML、python 脚本(即 .py 文件),甚至 LaTeX 文件。
好比,须要将 notebook 转换为 PDF 形式:
jupyter nbconvert --to pdf notebook.ipynb
复制代码
这个操做将生成一个 pdf 文件--notebook.pdf
,固然若是要实现转换为 PDF ,还须要安装一些必须的库--pandoc
和 LaTeX
,安装方法能够查看:
stackoverflow.com/a/52913424/…
默认状况下,nbconvert
并不会执行 notebook 里的代码,但能够添加 --execute
来让其运行代码:
jupyter nbconvert --to pdf --execute notebook.ipynb
复制代码
另外,还能够添加 --allow-errors
来让 nbconvert
会输出代码中的错误信息,而且不会由于出现错误而中断转换过程:
jupyter nbconvert --to pdf --execute --allow-errors notebook.ipynb
复制代码
要在 jupyter 中使用数据库,首先须要安装 ipython-sql
:
pip install ipython-sql
复制代码
安装好后,首先输入如下魔法命令来加载 ipython-sql
。
%load_ext sql
复制代码
接着就是链接到一个数据库:
%sql sqlite://
复制代码
输出:
'Connected: @None'
复制代码
这里是链接到一个临时的数据库,你也能够指定链接到你的数据库,能够按照官网(docs.sqlalchemy.org/en/latest/c…)的语法进行链接:
dialect+driver://username:password@host:port/database
复制代码
好比能够是相似 postgresql://scott:tiger@localhost/mydatabase
,也就是 driver
就是 postgresql
,usename
是 scott
,password
是 tiger
,host
是 localhost
,而后 database
是 mydatabse
.
接下来就是快速采用以前用 Seaborn
加载的 tips
的数据集来构建咱们的数据库:
接下来就能够对数据进行一些查询的操做,以下所示,这里须要用到多行魔法命令形式 %%
:
还能够进行更复杂的查询操做:
更多的例子能够查看 github.com/catherinede…
对比原文,其实删除了部份内容,好比脚本运行 jupyter 部分,自定义 jupyter 的样式,而后数据库部分也有所删减,主要是原文的代码老是缺失一部份内容。
参考
最后本文的代码都上传到 Github 上了:
欢迎关注个人微信公众号--算法猿的成长,或者扫描下方的二维码,你们一块儿交流,学习和进步!