1.3 重要的Python库
考虑到有些读者还不太了解Python科学计算生态和本书用到的库,下面先对各个库做简要介绍。
1.3.1 NumPy
NumPy(https://numpy.org)是Numerical Python(数值Python)的简称,长期以来都是Python科学计算的基础包。它提供了多种数据结构、算法以及大部分涉及Python数值计算所需的接口。NumPy还提供以下功能:
●快速、高效的多维数组对象ndarray。
●用于对数组执行元素级计算以及直接对数组执行数学运算的函数。
●用于读写硬盘上基于数组的数据集的工具。
●线性代数运算、傅里叶变换,以及随机数生成。
●成熟的C API,用于Python扩展和原生C、C++代码存取NumPy的数据结构和计算工具。
除了为Python提供快速的数组处理能力外,NumPy在数据分析方面还有另外一个主要作用,即作为在算法和库之间传递数据的容器。对于数值型数据,NumPy数组在存储和处理数据时要比内置的Python数据结构高效得多。此外,由底层语言(比如C和Fortran)编写的库可以直接操作NumPy数组中的数据,无须将数据复制到其他内存中后再操作。因此,许多Python的数值计算工具要么使用NumPy数组作为主要的数据结构,要么可以与NumPy进行无缝交互操作。
1.3.2 pandas
pandas(https://pandas.pydata.org)提供了快速便捷地处理结构化或表格型数据的高级数据结构和函数。自从2010年出现以来,它助力Python成为强大且高效的数据分析环境。本书中应用最多的pandas对象是DataFrame,这是面向列的表格型数据结构,既有行标签也有列标签。另一个数据结构是Series,它是一维的标签化数组对象。
pandas兼具NumPy的高性能数组计算能力以及表格和关系型数据库(例如SQL)的灵活数据操作功能。它提供了便捷的索引功能,可以完成重塑、切片、切块、连接和选取数据子集等操作。因为数据操作、预处理、清洗是数据分析中最重要的技能,所以pandas是本书的重点之一。
我是在2008年年初着手开发pandas的,那时我任职于AQR Capital Management,这是一家量化投资管理公司。我那时有许多特殊工作需求都不能用任何单一工具解决,包括:
●带有标签轴的数据结构,支持自动或清晰的数据对齐,以防止由于数据未对齐,以及处理不同数据源且不同索引的数据,而造成常见的错误。
●集成时间序列功能。
●用于同时处理时间序列数据和非时间序列数据的统一数据结构。
●算术运算和可以保存元数据的约简操作。
●灵活处理缺失数据。
●合并和其他常见于流行数据库(例如基于SQL的数据库)的关系型操作。
我想只用一种工具就实现所有这些功能,最好还是用通用软件开发语言实现。Python是一门不错的候选语言,但此时并没有集成的数据结构和工具来实现这些功能。因此我一开始就想把pandas设计为一款适用于金融和商业分析的工具,pandas尤其擅长深度时间序列的功能和工具,非常适合商务处理中生成的时间索引数据。
2011年和2012年,我和AQR的前同事Adam Klein、Chang She花费了大量时间拓展pandas的功能。2013年,我暂停了日以继夜的项目开发工作,致力于让pandas变为完全社区拥有、社区维护的项目,此时社区中有超过2000名来自世界各地的开发贡献者。
对于使用R语言进行统计计算的用户,肯定不会对DataFrame这个名字感到陌生,因为它源自R的data.frame对象。但与Python不同,数据帧是内置于R语言及其标准库的。因此,pandas的许多特点通常和R语言的核心实现或扩展包保持一致。
pandas这个名字源于面板数据(计量经济学中针对多维结构化数据集的术语),同时也是Python数据分析(Python data analysis)的缩写。
1.3.3 matplotlib
matplotlib(https://matplotlib.org/)是最流行的用于绘制图表和其他二维数据可视化的Python库。它最初由John D. Hunter创建,目前由一个庞大的开发团队维护。它非常适合创建出版物上使用的图表。虽然还有其他Python可视化库,但是matplotlib是使用最广泛的,并且它和其他生态工具配合也非常完美。我认为,可以使用matplotlib作为默认的可视化工具。
1.3.4 IPython和Jupyter
IPython项目(https://ipython.org/)起初是Fernando Pérez在2001年创建的一个更具交互性的Python解释器的副产品。在随后的20年,它成为Python数据栈非常重要的工具之一。虽然IPython本身没有提供任何计算和数据分析的工具,但它可以大大提高交互式计算和软件开发的生产率。IPython鼓励采用执行-探索(execute-explore)的工作流,区别于其他编程软件的编辑-编译-运行(edit-compile-run)的工作流。它还可以方便地访问系统的命令行和文件系统,这样一来在许多场景中就无须在终端窗口和Python会话中来回切换。由于大部分数据分析编码包括探索、试错和重复迭代,因此IPython可以更快地完成工作。
2014年,Fernando和IPython团队宣布了Jupyter项目(https://jupyter.org/),旨在设计一个适用于更多语言的交互式计算工具。IPython Web notebook则变成了Jupyter notebook,现在支持40多种编程语言。IPython现在可以作为内核(一种编程语言模式),用于在Jupyter中使用Python。
IPython自身变成了Jupyter庞大开源项目中的一个组件,Jupyter是交互和探索式计算的高效环境。IPython最古老、最简单的“模式”就是一个加强版的Python命令行终端,用于快速编写、测试、调试Python代码。你还可以在Jupyter notebook中使用IPython。
Jupyter notebook还可以编写Markdown和HTML文档,它提供了一种创建代码和文本的富文本方法。
我的大部分Python工作都要用到IPython和Jupyter,包括运行、调试和测试代码。
在本书的GitHub页面(https://github.com/wesm/pydata-book),你可以找到包含各章节所有代码实例的Jupyter notebook。如果读者不方便访问GitHub,还可以访问Gitee上的镜像地址(https://gitee.com/wesmckinn/pydata-book)。
1.3.5 SciPy
SciPy(https://scipy.org/)是专门解决科学计算中多种基本问题的包的集合。以下是其中的一些模块:
scipy.integrate
数值积分例程和微分方程求解器。
scipy.linalg
扩展了由numpy.linalg提供的线性代数例程和矩阵分解功能。
scipy.optimize
函数优化器(最小化器)以及求根算法。
scipy.signal
信号处理工具。
scipy.sparse
稀疏矩阵和稀疏线性系统求解器。
scipy.special
SPECFUN的封装器,SPECFUN是一个实现了许多常用数学函数(例如,gamma函数)的FORTRAN库。
scipy.stats
标准连续和离散概率分布(密度函数、采样器、连续分布函数)、各种统计检验方法,以及各类描述性统计。
结合使用NumPy和SciPy,便形成了一个相当完备和成熟的计算平台,可以处理多种传统的科学计算问题。
1.3.6 scikit-learn
自从2007年出现以来,scikit-learn(https://scikit-learn.org)就成为Python编程者首选的通用机器学习工具包。截至目前,有超过2000名开发者向scikit-learn贡献过代码。scikit-learn包括以下子模块:
●分类:支持向量机、最近邻、随机森林、逻辑回归等。
●回归:Lasso回归、岭回归等。
●聚类:k均值聚类、谱聚类等。
●降维:主成分分析、特征选择、矩阵分解等。
●模型选择:网格搜索、交叉验证、指标矩阵。
●预处理:特征提取、正态化。
pandas、statsmodels、IPython和scikit-learn对于Python成为高效数据科学编程语言起到了关键作用。虽然本书不会详细讲解scikit-learn,但会简要介绍scikit-learn的一些模型,以及本书包含的其他工具如何使用这些模型。
1.3.7 statsmodels
statsmodels(https://www.statsmodels.org)是一个统计分析包,源于斯坦福大学统计学教授Jonathan Taylor,他设计了多种流行于R语言的回归分析模型。Skipper Seabold和Josef Perktold在2010年正式创建了新的statsmodels项目,随后汇集了大量的使用者和贡献者。受到R语言公式系统的启发,Nathaniel Smith开发了Patsy项目,提供了statsmodels的公式或模型的规范框架。
与scikit-learn相比,statsmodels包含经典统计学(主要是频度)和计量经济学的算法。它包括如下子模块:
●回归模型:线性回归、广义线性模型、鲁棒线性模型、线性混合效应模型等。
●方差分析(ANalysis Of VAriance,ANOVA)。
●时间序列分析:AR、ARMA、ARIMA、VAR等模型。
●非参数方法:核密度估计、核回归。
●统计模型结果可视化。
statsmodels更关注统计推断,提供不确定性估计和p值参数检验。相反,scikit-learn更关注预测。
与scikit-learn一样,本书只简要介绍statsmodels,以及NumPy和pandas如何使用它。
1.3.8 其他包
关于数据科学的书中可能会介绍许多其他的Python包,其中就有一些新的项目,比如TensorFlow或PyTorch,它们在机器学习和人工智能领域非常流行。但既然现在已经有其他书专门介绍这些项目,建议用本书学好常用的Python数据规整操作,为学习TensorFlow或PyTorch打好基础。