好久不见,日常的忙碌告一段落之后终于可以继续做做自己感兴趣的事,看看自己感兴趣的书。
最近开了《Python数据科学手册》这本的新坑,缘由大概是之前研究matplotlib中数据可视化的basemap包时发现此书的结构和内容看起来还不错,故在豆瓣标记了想读。然后也是被国内图书的价格震惊到了,遂于读书日疯狂在亚马逊采购了一批书。
稍微介绍下这本书的背景,本书的内容主要包括Python在数据科学领域的基本工具(栈,我总喜欢称为Library 或者包 = =),包括Ipython, Jupyter, Numpy, Pandas, Matplotlib和 Scikit-learn(咦?高大上的机器学习?)。本书作者Jake VanderPlus是华盛顿大学eScience学院物理科学研究院院长,擅长Python科学计算和数据可视化,虽然我没听说过,但之前景大根专门被公司派去西雅图跟着华盛顿大学的一个类似于培训班的东西学习Python那么想来水平应该不会差。
这一系列的文章读者设定是自己,因为之前也提过自己的学习路径是LPTHW(笨办法学Python)到Python for Data Analysis再到廖雪峰先生的Python教学网站(嗯...老实说没学完还?印象中练习到了OOP), 学习此书更多的也是为了查漏补缺起一个巩固自己在python数据科学/科学计算方面知识的作用。 如此,这组个人向文章更多的是类似于读书笔记或者针对性的记录一些之前不曾掌握的知识,作为电子版笔记的存档,故对其他读者(倘若有)的借鉴意义不是很大。
废话少说,Life is short, we use Python.
Chapter 1 Ipython: 超越Python
1.1 一种可行的Python安装方法
之前提过傻瓜式安装可以使用Anaconda发行版,傻瓜式集成数百个牵扯到数据分析和科学计算的包的一站式Python。
此书前言中提到如果不想一次性占据如此多的空间和根据需求再管理需要的程序包情况下,Anaconda也提供了一种叫做Miniconda的版本。内部仅包含了Python解释器和conda(command line),之后用到的包 都可以采取诸如:
conda install LibraryName
即可
1.2 Ipython的两种形式
Python Shell 类似于现如今WIN10自带的power shell是一个命令行工具,对小白怎么理解呢...嗯就当是最早的DOS那种黑漆漆的环境是不是就可以了?
Jupyter Notebook 高大上多了,是基于浏览器的GUI。一般很适合用于课堂或者演讲演示,交互式的环境和简洁美观的格式都让人心情好很多(专业程序员应该十分鄙视?不过这个作者好像还挺推崇的)
第一章主要介绍了下Ipython的强大之处,说老实话看完这一章我也成了Ipython的半个粉丝,恨不得立刻抛下之前使用的Notepad++和IDLE重投Jupyter Notebook的怀抱,那么有哪些我事先不知道的特性打动了我呢?
1.3获取文档/获取源代码/自动补全
对象名/函数名+符号?
例:len? # len函数是自带的返回对象长度的函数#
可直接获取文档信息(事实上就是返回代码中的内嵌文档,一般一些的理解是我们在对象和函数内嵌的解释说明类注释,这也提示了我们应该养成在函数编写过程中添加功能性注释的好习惯)
对象名/函数名+符号??
这是获取源代码的快捷方式(所以使用了两个问号)
如果在使用过程中使用??发现不能显示源代码,说明我们查询的对象并不是由python语言实现,底层应该是使用C语言或者其他编译扩展语言实现,此种情况下,??后缀实现的功能等同于?后缀实现的功能(查看代码中的内嵌文档)
对象.<Tab>
一个十分有用的功能,Tab键自动补全未完成的内容(譬如对一个列表对象,你使用list.<tab>会得到所有关于列表对象的可用属性。当然你也可以先输入首字母等缩小<tab>自动补全的对象范围)
注1:python也与SQL语言一样,我们也可以使用wildcard(通配符)来模糊查询,这种方法好处是可以通过*匹配中间或者末尾的字符,相较于之,<tab>无法实现这个功能。
1.4 查询历史命令
一般我们在python中是通过向上键/向下键查询之前输入过的指令,Ipython在此之外还提供了ctrl+r输入相似字符来精确查找(可以理解成word/excel内的搜索功能,如果有多个满足条件的语句,多次按下ctrl+r可遍历各结果)
接下来介绍了Ipython最引以为豪的magic command(魔法指令)
1.5 粘贴代码块
当我们从其他网站拷贝代码块直接复制粘贴进python时总会有恼人的>或者->使得我们无法直接测试程序,这种错误大都是由缩进和解释符号引起的。而%paste解决了这个包含符号的多行输入问题。与之类似的,%cpaste会打开一个交互式的多行输入提示,在此提示下我们可以粘贴并执行一个甚至多个代码块
1.6 Ipython的输入和输出对象
我们常常在Ipython Shell中和Jupyter Notebook看到类似于 In [1]/Out [1]这样的标记,好像除了帮我们数行数没有更多的功能,看了本书第一章我才知道Ipython实际创建了叫做In和Out的python变量,这意味着我们可以调用这些变量进行后续推导计算。正如书中所说的,如果我们在执行一个非常复杂的计算并且希望重复利用运算结果,那么通过诸如演算 math.sin(Out [13]) * math.cos(Out[15])就变得非常有用了。
注2: In对象是一个列表, Out对象是一个字典。
注3: Out [x]的简写形式是 _x(即一条下划线加行号)
1.7Ipython终端直接执行shell命令
与标准Python解释器交互时,我们经常需要在多个python工具和系统命令行工具窗口中来回切换,而Ipython跨越了这个鸿沟,提供了从Ipython终端直接执行shell命令的语法,这个符号就是简单的感叹号(!)。任何在!之后的内容将不会通过python内核运行,而是通过系统命令行运行。
注4:不仅是执行,我们也可以将在shell中运行得到的对象存储到python中,值得注意的是这些结果并不是以列表的形式返回, 而是以Ipython中定义的一个特殊shell返回类型的形式返回:type = Ipython.utils.text.SList
1.8调试:Ipdb提示符
可以用于探索栈空间的当前状态,探索可用变量,甚至运行python命令。
1.9代码计时
%timeit指令可以让代码段重复运行来计算代码的运行时间,根据代码运行快慢,%timeit将自动调整并减少重复执行的次数。一个具有隐患的问题是重复操作并不一定适用于所有情况,譬如对一个预先排序好的列表进行排序,比对一个无需的列表排序要快,重复运行将使结果出现偏差。%timeit计时相较%timeit总是较短,这是因为它在底层做了一些聪明的事情来组织系统调用对计时过程的干扰(譬如%timeit阻止了garbage collection)
%timeit对于运行时间较长的命令来说,较短的系统延迟不太可能影响结果,此时%time魔法函数是一个不错的选择
注5:%time和%timeit都可以通过双百分号语法实现多行代码的计时
1.10分析整个脚本 %prun
1.11逐行分析 %lprun
1.12内存分析
%memit检测函数消耗内存
%mprun逐行代码的内存消耗检测
以上看出除了我们常见的魔法指令外,Ipython 在包括同时应对python解释器和命令行语句、获取额外信息(内嵌文档/源代码)、复制粘贴代码块等方面确实体现了超越python的优越性。