1.1 本书的内容
本书讲的是利用Python进行数据控制、处理、整理、分析等方面的具体细节和基本要点。我的目标是介绍Python编程和用于数据处理的库和工具环境,掌握这些,可以让你成为一个数据分析专家。虽然本书的标题是“数据分析”,重点确实Python编程、库,以及用于数据分析的工具。这就是数据分析要用到的Python编程。
什么样的数据?主要指的是结构化数据(structured data)
- 表格型数据,其中各列可能是不同的类型(字符串、数值、日期等)。比如保存在关系型数据库中或以制表符/逗号为分隔符的文本文件中的那些数据。
- 多维数组(矩阵)。
- 通过关键列(对于SQL用户而言,就是主键和外键)相互联系的多个表。
- 间隔平均或不平均的时间序列。
1.2 为什么要使用Python进行数据分析
- Python发展出了一个巨大而活跃的科学计算(scientific computing)社区
- Python的库(例如pandas和scikit-learn)不断改良
- 我们完全可以只使用Python这一种语言构建以数据为中心的应用。
Python作为胶水语言
它能够轻松地集成C、C++以及Fortran代码。大部分现代计算环境都利用了一些Fortran和C库来实现线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。
大多数软件都是由两部分代码组成的:少量需要占用大部分执行时间的代码,以及大量不经常执行的“胶水代码”。
解决“两种语言”问题
人们逐渐意识到,Python不仅适用于研究和原型构建,同时也适用于构建生产系统。为什么一种语言就够了,却要使用两个语言的开发环境呢?
为什么不选Python
虽然Python非常适合构建分析应用以及通用系统,但它对不少应用场景适用性较差。
对于高并发、多线程的应用程序而言(尤其是拥有许多计算密集型线程的应用程序),Python并不是一种理想的编程语言。这是因为Python有一个叫做全局解释器锁(Global Interpreter Lock,GIL)的组件,这是一种防止解释器同时执行多条Python字节码指令的机制。有关“为什么会存在GIL”的技术性原因超出了本书的范围。
1.3 重要的Python库
考虑到那些还不太了解Python科学计算生态系统和库的读者,下面我先对各个库做一个简单的介绍。
NumPy
NumPy(Numerical Python的简称)是Python科学计算的基础包。本书大部分内容都基于NumPy以及构建于其上的库。它提供了以下功能(不限于此):
- 快速高效的**多维数组对象**ndarray。
- 用于对数组执行元素级计算以及直接对数组执行数学运算的函数。
- 用于读写硬盘上基于数组的数据集的工具。
- 线性代数运算、傅里叶变换,以及随机数生成。
-成熟的C API, 用于Python插件和原生C、C++、Fortran代码访问NumPy的数据结构和计算工具。
特性:
- 作为在算法和库之间传递数据的容器
- 由低级语言(比如C和Fortran)编写的库可以直接操作NumPy数组中的数据,无需进行任何数据复制工作。
- 许多Python的数值计算工具要么使用NumPy数组作为主要的数据结构,要么可以与NumPy进行无缝交互操作。
pandas
pandas提供了快速便捷处理结构化数据的大量数据结构和函数。
本书用得最多的pandas对象是DataFrame,它是一个面向列(column-oriented)的二维表结构,另一个是Series,一个一维的标签化数组对象。
pandas兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库(如SQL)灵活的数据处理功能。数据操作、准备、清洗是数据分析最重要的技能,pandas是本书的重点。
pandas这个名字源于panel data(面板数据,这是多维结构化数据集在计量经济学中的术语)以及Python data analysis(Python数据分析)。
matplotlib
matplotlib是最流行的用于绘制图表和其它二维数据可视化的Python库。它最初由John D.Hunter(JDH)创建,目前由一个庞大的开发人员团队维护。它非常适合创建出版物上用的图表。虽然还有其它的Python可视化库,matplotlib却是使用最广泛的,并且它和其它生态工具配合也非常完美。我认为,可以使用它作为默认的可视化工具。
IPython和Jupyter
IPython鼓励“执行-探索”的工作流,区别于其它编程软件的“编辑-编译-运行”的工作流。它还可以方便地访问系统的shell和文件系统。因为大部分的数据分析代码包括探索、试错和重复,IPython可以使工作更快。
在本书的GitHub页面,你可以找到包含各章节所有代码实例的Jupyter notebooks。
SciPy
SciPy是一组专门解决科学计算中各种标准问题域的包的集合,主要包括下面这些包:
- scipy.integrate:数值积分例程和微分方程求解器。
- scipy.linalg:扩展了由numpy.linalg提供的线性代数例程和矩阵分解功能。
- scipy.optimize:函数优化器(最小化器)以及根查找算法。
- scipy.signal:信号处理工具。
- scipy.sparse:稀疏矩阵和稀疏线性系统求解器。
- scipy.special:SPECFUN(这是一个实现了许多常用数学函数(如伽玛函数)的Fortran库)的包装器。
- scipy.stats:标准连续和离散概率分布(如密度函数、采样器、连续分布函数等)、各种统计检验方法,以及更好的描述统计法。
NumPy和SciPy结合使用,便形成了一个相当完备和成熟的计算平台,可以处理多种传统的科学计算问题。
scikit-learn
2010年诞生以来,scikit-learn成为了Python的通用机器学习工具包。仅仅七年,就汇聚了全世界超过1500名贡献者。它的子模块包括:
- 分类:SVM、近邻、随机森林、逻辑回归等等。
- 回归:Lasso、岭回归等等。
- 聚类:k-均值、谱聚类等等。
- 降维:PCA、特征选择、矩阵分解等等。
- 选型:网格搜索、交叉验证、度量。
- 预处理:特征提取、标准化。
与pandas、statsmodels和IPython一起,scikit-learn对于Python成为高效数据科学编程语言起到了关键作用。虽然本书不会详细讲解scikit-learn,我会简要介绍它的一些模型,以及用其它工具如何使用这些模型。
statsmodels
与scikit-learn比较,statsmodels包含经典统计学和经济计量学的算法。包括如下子模块:
- 回归模型:线性回归,广义线性模型,健壮线性模型,线性混合效应模型等等。
- 方差分析(ANOVA)。
- 时间序列分析:AR,ARMA,ARIMA,VAR和其它模型。
- 非参数方法: 核密度估计,核回归。
- 统计模型结果可视化。
statsmodels更关注与统计推断,提供不确定估计和参数p-值。相反的,scikit-learn注重预测。
同scikit-learn一样,我也只是简要介绍statsmodels,以及如何用NumPy和pandas使用它。
1.4 安装和设置
Windows
要在Windows上运行,先下载Anaconda安装包。推荐跟随Anaconda下载页面的Windows安装指导,安装指导在写作本书和读者看到此文的的这段时间内可能发生变化。
安装或升级Python包
在你阅读本书的时候,你可能想安装另外的不在Anaconda中的Python包。通常,可以用以下命令安装:
conda install package_name
如果这个命令不行,也可以用pip包管理工具:
pip install package_name
你可以用conda update
命令升级包:
conda update package_name
pip可以用--upgrade
升级:
pip install --upgrade package_name
本书中,你有许多机会尝试这些命令。
注意:当你使用conda和pip二者安装包时,千万不要用pip升级conda的包,这样会导致环境发生问题。当使用Anaconda或Miniconda时,最好首先使用conda进行升级。
本书基于Python 3.6。你的Python版本也许高于3.6,但是示例代码应该是向前兼容的。一些示例代码可能在Python 2.7上有所不同,或完全不兼容。
集成开发环境(IDEs)和文本编辑器
当被问到我的标准开发环境,我几乎总是回答“IPython加文本编辑器”。
1.5 社区和会议
除了在网上搜索,各式各样的科学和数据相关的Python邮件列表是非常有帮助的,很容易获得回答。包括:
- pydata:一个Google群组列表,用以回答Python数据分析和pandas的问题;
- pystatsmodels: statsmodels或pandas相关的问题;
- scikit-learn和Python机器学习邮件列表,scikit-learn@python.org;
- numpy-discussion:和NumPy相关的问题;
- scipy-user:SciPy和科学计算的问题;
因为这些邮件列表的URLs可以很容易搜索到,但因为可能发生变化,所以没有给出。
每年,世界各地会举办许多Python开发者大会。如果你想结识其他有相同兴趣的人,如果可能的话,我建议你去参加一个。许多会议会对无力支付入场费和差旅费的人提供财力帮助。下面是一些会议:
- PyCon和EuroPython:北美和欧洲的两大Python会议;
- SciPy和EuroSciPy:北美和欧洲两大面向科学计算的会议;
- PyData:世界范围内,一些列的地区性会议,专注数据科学和数据分析;
- 国际和地区的PyCon会议(http://pycon.org有完整列表) 。
1.6 本书导航
如果之前从未使用过Python,那你可能需要先看看本书的第2章和第3章,我简要介绍了Python的特点,IPython和Jupyter notebooks。这些知识是为本书后面的内容做铺垫。如果你已经掌握Python,可以选择跳过。
我介绍了pandas,本书剩余的内容全部是使用pandas、NumPy和matplotlib处理数据分析的问题。我已经尽量让全书的结构循序渐进,但偶尔会有章节之间的交叉,有时用到的概念还没有介绍过。
尽管读者各自的工作任务不同,大体可以分为几类:
- 与外部世界交互
阅读编写多种文件格式和数据商店; - 数据准备
清洗、修改、结合、标准化、重塑、切片、切割、转换数据,以进行分析; - 转换数据
对旧的数据集进行数学和统计操作,生成新的数据集(例如,通过各组变量聚类成大的表); - 建模和计算
将数据绑定统计模型、机器学习算法、或其他计算工具; - 展示
创建交互式和静态的图表可视化和文本总结。
代码示例
本书大部分代码示例的输入形式和输出结果都会按照其在IPython shell或Jupyter notebooks中执行时的样子进行排版:
In [5]: CODE EXAMPLE
Out[5]: OUTPUT
但你看到类似的示例代码,就是让你在in
的部分输入代码,按Enter键执行(Jupyter中是按Shift-Enter)。然后就可以在out
看到输出。
示例数据
各章的示例数据都存放在GitHub上:http://github.com/pydata/pydata-book。下载这些数据的方法有二:使用git版本控制命令行程序;直接从网站上下载该GitHub库的zip文件。如果遇到了问题,可以到我的个人主页,http://wesmckinney.com/,获取最新的指导。
引入惯例
Python社区已经广泛采取了一些常用模块的命名惯例:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import statsmodels as sm
也就是说,当你看到np.arange时,就应该想到它引用的是NumPy中的arange函数。这样做的原因是:在Python软件开发过程中,不建议直接引入类似NumPy这种大型库的全部内容(from numpy import *)。
行话
由于你可能不太熟悉书中使用的一些有关编程和数据科学方面的常用术语,所以我在这里先给出其简单定义:
数据规整(Munge/Munging/Wrangling)
指的是将非结构化和(或)散乱数据处理为结构化或整洁形式的整个过程。这几个词已经悄悄成为当今数据黑客们的行话了。Munge这个词跟Lunge押韵。
伪码(Pseudocode)
算法或过程的“代码式”描述,而这些代码本身并不是实际有效的源代码。
语法糖(Syntactic sugar)
这是一种编程语法,它并不会带来新的特性,但却能使代码更易读、更易写。