查看原文
其他

【翻译】《利用Python进行数据分析·第2版》第2章(上)Python语法基础,IPython和Jupyter

2018-03-08 SeanCheney Python爱好者社区

作者:SeanCheney   Python爱好者社区专栏作者

简书专栏:https://www.jianshu.com/u/130f76596b02


前文传送门:

【翻译】《利用Python进行数据分析·第2版》第1章 准备工作


当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少。这部分上是一个鸡和蛋的问题:我们现在使用的库,比如pandas、scikit-learn和statsmodels,那时相对来说并不成熟。2017年,数据科学、数据分析和机器学习的资源已经很多,原来通用的科学计算拓展到了计算机科学家、物理学家和其它研究领域的工作人员。学习Python和成为软件工程师的优秀书籍也有了。


因为这本书是专注于Python数据处理的,对于一些Python的数据结构和库的特性难免不足。因此,本章和第3章的内容只够你能学习本书后面的内容。


在我来看,没有必要为了数据分析而去精通Python。我鼓励你使用IPython shell和Jupyter试验示例代码,并学习不同类型、函数和方法的文档。虽然我已尽力让本书内容循序渐进,但读者偶尔仍会碰到没有之前介绍过的内容。


本书大部分内容关注的是基于表格的分析和处理大规模数据集的数据准备工具。为了使用这些工具,必须首先将混乱的数据规整为整洁的表格(或结构化)形式。幸好,Python是一个理想的语言,可以快速整理数据。使用Python越熟练,越容易准备新的数据集以进行分析。


本书中使用的工具最好在IPython和Jupyter中亲自尝试。当你学会了如何启用Ipython和Jupyter,我建议你跟随示例代码进行练习。与任何键盘驱动的操作环境一样,记住常见的命令也是学习曲线的一部分。


笔记:本章没有介绍Python的某些概念,如类和面向对象编程,你可能会发现它们在Python数据分析中很有用。
为了加强Python知识,我建议你学习官方Python教程,https://docs.python.org/3/,或是通用的Python教程书籍,比如:


  • Python Cookbook,第3版,David Beazley和Brian K. Jones著(O’Reilly)

  • 流畅的Python,Luciano Ramalho著 (O’Reilly)

  • 高效的Python,Brett Slatkin著 (Pearson)


2.1 Python解释器


Python是解释性语言。Python解释器同一时间只能运行一个程序的一条语句。标准的交互Python解释器可以在命令行中通过键入python命令打开:


$ python Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12) [GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = 5 >>> print(a) 5


>>>提示输入代码。要退出Python解释器返回终端,可以输入exit()或按Ctrl-D。


运行Python程序只需调用Python的同时,使用一个.py文件作为它的第一个参数。假设创建了一个hello_world.py文件,它的内容是:


print('Hello world')


你可以用下面的命令运行它(hello_world.py文件必须位于终端的工作目录):


$ python hello_world.py Hello world


一些Python程序员总是这样执行Python代码的,从事数据分析和科学计算的人却会使用IPython,一个强化的Python解释器,或Jupyter notebooks,一个网页代码笔记本,它原先是IPython的一个子项目。在本章中,我介绍了如何使用IPython和Jupyter,在附录A中有更深入的介绍。当你使用%run命令,IPython会同样执行指定文件中的代码,结束之后,还可以与结果交互:


$ ipython Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12) Type "copyright", "credits" or "license" for more information. IPython 5.1.0 -- An enhanced Interactive Python. ?         -> Introduction and overview of IPython's features. %quickref -> Quick reference. help      -> Python's own help system. object?   -> Details about 'object', use 'object??' for extra details. In [1]: %run hello_world.py Hello world In [2]:


IPython默认采用序号的格式In [2]:,与标准的>>>提示符不同。


2.2 IPython基础


在本节中,我们会教你打开运行IPython shell和jupyter notebook,并介绍一些基本概念。


运行IPython Shell


你可以用ipython在命令行打开IPython Shell,就像打开普通的Python解释器:


$ ipython Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12) Type "copyright", "credits" or "license" for more information. IPython 5.1.0 -- An enhanced Interactive Python. ?         -> Introduction and overview of IPython's features. %quickref -> Quick reference. help      -> Python's own help system. object?   -> Details about 'object', use 'object??' for extra details. In [1]: a = 5 In [2]: a Out[2]: 5


你可以通过输入代码并按Return(或Enter),运行任意Python语句。当你只输入一个变量,它会显示代表的对象:


In [5]: import numpy as np In [6]: data = {i : np.random.randn() for i in range(7)} In [7]: data Out[7]: {0: -0.20470765948471295, 1: 0.47894333805754824, 2: -0.5194387150567381, 3: -0.55573030434749, 4: 1.9657805725027142, 5: 1.3934058329729904, 6: 0.09290787674371767}


前两行是Python代码语句;第二条语句创建一个名为data的变量,它引用一个新创建的Python字典。最后一行打印data的值。


许多Python对象被格式化为更易读的形式,或称作pretty-printed,它与普通的print不同。如果在标准Python解释器中打印上述data变量,则可读性要降低:


>>> from numpy.random import randn >>> data = {i : randn() for i in range(7)} >>> print(data) {0: -1.5948255432744511, 1: 0.10569006472787983, 2: 1.972367135977295, 3: 0.15455217573074576, 4: -0.24058577449429575, 5: -1.2904897053651216, 6: 0.3308507317325902}


IPython还支持执行任意代码块(通过一个华丽的复制-粘贴方法)和整段Python脚本的功能。你也可以使用Jupyter notebook运行大代码块,接下来就会看到。


运行Jupyter Notebook


Jupyter项目的重要组件之久就是notebook,它是一个代码、文本(有标记或无标记)、数据可视化或其它输出的交互式文档。Jupyter Notebook需要与内核互动,内核是Jupyter与其它编程语言的交互编程协议。Python的Jupyter内核是使用IPython。要启动Jupyter,在命令行中输入jupyter notebook:


$ jupyter notebook [I 15:20:52.739 NotebookApp] Serving notebooks from local directory: /home/wesm/code/pydata-book [I 15:20:52.739 NotebookApp] 0 active kernels [I 15:20:52.739 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/ [I 15:20:52.740 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). Created new window in existing browser session.


在多数平台上,Jupyter会自动打开默认的浏览器(除非指定了--no-browser)。或者,可以在启动notebook之后,手动打开网页http://localhost:8888/。图2-1展示了Google Chrome中的notebook。


笔记:许多人使用Jupyter作为本地的计算环境,但它也可以部署到服务器上远程访问。这里不做介绍,如果需要的话,鼓励读者自行到网上学习。


图2-1 Jupyter notebook启动页面


要新建一个notebook,点击按钮New,选择“Python3”或“conda[默认项]”。如果是第一次,点击空格,输入一行Python代码。然后按Shift-Enter执行。


图2-2 Jupyter新notebook页面


当保存notebook时(File目录下的Save and Checkpoint),会创建一个后缀名为.ipynb的文件。这是一个自包含文件格式,包含当前笔记本中的所有内容(包括所有已评估的代码输出)。可以被其它Jupyter用户加载和编辑。要加载存在的notebook,把它放到启动notebook进程的相同目录内。你可以用本书的示例代码练习,见图2-3。


虽然Jupyter notebook和IPython shell使用起来不同,本章中几乎所有的命令和工具都可以通用。


图2-3 Jupyter查看一个存在的notebook的页面


Tab补全


从外观上,IPython shell和标准的Python解释器只是看起来不同。IPython shell的进步之一是其它IDE和交互计算分析环境都有的tab补全功能。在shell中输入表达式,按下Tab,会搜索已输入变量(对象、函数等等)的命名空间:


In [1]: an_apple = 27 In [2]: an_example = 42 In [3]: an<Tab> an_apple    and         an_example  any


在这个例子中,IPython呈现除了之前两个定义的变量和Python的关键字和内建的函数any。当然,你也可以补全任何对象的方法和属性:


In [3]: b = [1, 2, 3] In [4]: b.<Tab> b.append  b.count   b.insert  b.reverse b.clear   b.extend  b.pop     b.sort b.copy    b.index   b.remove


同样也适用于模块:


In [1]: import datetime In [2]: datetime.<Tab> datetime.date          datetime.MAXYEAR       datetime.timedelta datetime.datetime      datetime.MINYEAR       datetime.timezone datetime.datetime_CAPI datetime.time          datetime.tzinfo


在Jupyter notebook和新版的IPython(5.0及以上),自动补全功能是下拉框的形式。


笔记:注意,默认情况下,IPython会隐藏下划线开头的方法和属性,比如魔术方法和内部的“私有”方法和属性,以避免混乱的显示(和让新手迷惑!)这些也可以tab补全,但是你必须首先键入一个下划线才能看到它们。如果你喜欢总是在tab补全中看到这样的方法,你可以IPython配置中进行设置。可以在IPython文档中查找方法。


除了补全命名、对象和模块属性,Tab还可以补全其它的。当输入看似文件路径时(即使是Python字符串),按下Tab也可以补全电脑上对应的文件信息:


In [7]: datasets/movielens/<Tab> datasets/movielens/movies.dat    datasets/movielens/README datasets/movielens/ratings.dat   datasets/movielens/users.dat In [7]: path = 'datasets/movielens/<Tab> datasets/movielens/movies.dat    datasets/movielens/README datasets/movielens/ratings.dat   datasets/movielens/users.dat


结合%run,tab补全可以节省许多键盘操作。


另外,tab补全可以补全函数的关键词参数(包括等于号=)。见图2-4。


图2-4 Jupyter notebook中自动补全函数关键词


我们来仔细看看函数。


自省


在变量前后使用问号?,可以显示对象的信息:


In [8]: b = [1, 2, 3] In [9]: b? Type:       list String Form:[1, 2, 3] Length:     3 Docstring: list() -> new empty list list(iterable) -> new list initialized from iterable's items In [10]: print? Docstring: print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file:  a file-like object (stream); defaults to the current sys.stdout. sep:   string inserted between values, default a space. end:   string appended after the last value, default a newline. flush: whether to forcibly flush the stream. Type:      builtin_function_or_method


这可以作为对象的自省。如果对象是一个函数或实例方法,定义过的文档字符串,也会显示出信息。假设我们写了一个如下的函数:


def add_numbers(a, b):    """    Add two numbers together    Returns    -------    the_sum : type of arguments    """    return a + b


然后使用?符号,就可以显示如下的文档字符串:


In [11]: add_numbers? Signature: add_numbers(a, b) Docstring: Add two numbers together Returns ------- the_sum : type of arguments File:      <ipython-input-9-6a548a216e27> Type:      function


使用??会显示函数的源码:


In [12]: add_numbers?? Signature: add_numbers(a, b) Source: def add_numbers(a, b):    """    Add two numbers together    Returns    -------    the_sum : type of arguments    """    return a + b File:      <ipython-input-9-6a548a216e27> Type:      function


?还有一个用途,就是像Unix或Windows命令行一样搜索IPython的命名空间。字符与通配符结合可以匹配所有的名字。例如,我们可以获得所有包含load的顶级NumPy命名空间:


In [13]: np.*load*? np.__loader__ np.load np.loads np.loadtxt np.pkgload


%run命令


你可以用%run命令运行所有的Python程序。假设有一个文件ipython_script_test.py


def f(x, y, z):    return (x + y) / z a = 5 b = 6 c = 7.5 result = f(a, b, c)


可以如下运行:


In [14]: %run ipython_script_test.py


这段脚本运行在空的命名空间(没有import和其它定义的变量),因此结果和普通的运行方式python script.py相同。文件中所有定义的变量(import、函数和全局变量,除非抛出异常),都可以在IPython shell中随后访问:


In [15]: c Out [15]: 7.5 In [16]: result Out[16]: 1.4666666666666666


如果一个Python脚本需要命令行参数(在sys.argv中查找),可以在文件路径之后传递,就像在命令行上运行一样。


笔记:如果想让一个脚本访问IPython已经定义过的变量,可以使用%run -i


在Jupyter notebook中,你也可以使用%load,它将脚本导入到一个代码格中:


>>> %load ipython_script_test.py    def f(x, y, z):        return (x + y) / z    a = 5    b = 6    c = 7.5    result = f(a, b, c)


中断运行的代码


代码运行时按Ctrl-C,无论是%run或长时间运行命令,都会导致KeyboardInterrupt。这会导致几乎左右Python程序立即停止,除非一些特殊情况。


警告:当Python代码调用了一些编译的扩展模块,按Ctrl-C不一定将执行的程序立即停止。在这种情况下,你必须等待,直到控制返回Python解释器,或者在更糟糕的情况下强制终止Python进程。


从剪贴板执行程序


如果使用Jupyter notebook,你可以将代码复制粘贴到任意代码格执行。在IPython shell中也可以从剪贴板执行。假设在其它应用中复制了如下代码:


x = 5 y = 7 if x > 5:    x += 1    y = 8


最简单的方法是使用%paste%cpaste函数。%paste可以直接运行剪贴板中的代码:


In [17]: %paste x = 5 y = 7 if x > 5:    x += 1    y = 8 ## -- End pasted text --


%cpaste功能类似,但会给出一条提示:


In [18]: %cpaste Pasting code; enter '--' alone on the line to stop or use Ctrl-D. :x = 5 :y = 7 :if x > 5: :    x += 1 : :    y = 8 :--


使用%cpaste,你可以粘贴任意多的代码再运行。你可能想在运行前,先看看代码。如果粘贴了错误的代码,可以用Ctrl-C中断。


键盘快捷键


IPython有许多键盘快捷键进行导航提示(类似Emacs文本编辑器或UNIX  bash Shell)和交互shell的历史命令。表2-1总结了常见的快捷键。图2-5展示了一部分,如移动光标。


图2-5 IPython shell中一些快捷键的说明


表2-1 IPython的标准快捷键


Jupyter notebooks有另外一套庞大的快捷键。因为它的快捷键比IPython的变化快,建议你参阅Jupyter notebook的帮助文档。


魔术命令


IPython中特殊的命令(Python中没有)被称作“魔术”命令。这些命令可以使普通任务更便捷,更容易控制IPython系统。魔术命令是在指令前添加百分号%前缀。例如,可以用%timeit(这个命令后面会详谈)测量任何Python语句,例如矩阵乘法,的执行时间:


In [20]: a = np.random.randn(100, 100) In [20]: %timeit np.dot(a, a) 10000 loops, best of 3: 20.9 µs per loop


魔术命令可以被看做IPython中运行的命令行。许多魔术命令有“命令行”选项,可以通过?查看:


In [21]: %debug? Docstring: ::  %debug [--breakpoint FILE:LINE] [statement [statement ...]] Activate the interactive debugger. This magic command support two ways of activating debugger. One is to activate debugger before executing code.  This way, you can set a break point, to step through the code from the point. You can use this mode by giving statements to execute and optionally a breakpoint. The other one is to activate debugger in post-mortem mode.  You can activate this mode simply running %debug without any argument. If an exception has just occurred, this lets you inspect its stack frames interactively.  Note that this will always work only on the last traceback that occurred, so you must call this quickly after an exception that you wish to inspect has fired, because if another one occurs, it clobbers the previous one. If you want IPython to automatically do this on every exception, see the %pdb magic for more details. positional arguments:  statement             Code to run in debugger. You can omit this in cell                        magic mode. optional arguments:  --breakpoint <FILE:LINE>, -b <FILE:LINE>                        Set break point at LINE in FILE.


魔术函数默认可以不用百分号,只要没有变量和函数名相同。这个特点被称为“自动魔术”,可以用%automagic打开或关闭。


一些魔术函数与Python函数很像,它的结果可以赋值给一个变量:


In [22]: %pwd Out[22]: '/home/wesm/code/pydata-book In [23]: foo = %pwd In [24]: foo Out[24]: '/home/wesm/code/pydata-book'


IPython的文档可以在shell中打开,我建议你用%quickref%magic学习下所有特殊命令。表2-2列出了一些可以提高生产率的交互计算和Python开发的IPython指令。


表2-2 一些常用的IPython魔术命令


集成Matplotlib


IPython在分析计算领域能够流行的原因之一是它非常好的集成了数据可视化和其它用户界面库,比如matplotlib。不用担心以前没用过matplotlib,本书后面会详细介绍。%matplotlib魔术函数配置了IPython shell和Jupyter notebook中的matplotlib。这点很重要,其它创建的图不会出现(notebook)或获取session的控制,直到结束(shell)。


在IPython shell中,运行%matplotlib可以进行设置,可以创建多个绘图窗口,而不会干扰控制台session:


In [26]: %matplotlib Using matplotlib backend: Qt4Agg


在Jupyter中,命令有所不同(图2-6):


In [26]: %matplotlib inline


图2-6 Jupyter行内matplotlib作图


赞赏作者

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存