NumPy(Numerical Python的简称)是Python科学计算的基础包。它提供了以下功能(不限于此): (1)快速有效的多维数组对象ndarray。 (2)用于对数组执行元素级计算以及直接对数组执行数学运算的函数。 (3)用于读写硬盘上基于数组的数据集的工具。 (4)线性代数运算、傅里叶变换,以及随机数生成。 (5)成熟的C API, 用于Python插件和原生C、C++、Fortran代码访问NumPy的数据结构和计算工具。
除了为Python提供快速的数组处理能力,NumPy在数据分析方面还有另外一个主要作用,即作为在算法和库之间传递数据的容器。对于数值型数据,NumPy数组在存储和处理数据时要比内置的Python数据结构高效得多。此外,由低级语言(比如C和Fortran)编写的库可以直接操作NumPy数组中的数据,无需进行任何数据复制工作。因此,许多Python的数值计算工具要么使用NumPy数组作为主要的数据结构,要么可以与NumPy进行无缝交互操作。
pandas提供了快速便捷处理结构化数据的大量数据结构和函数。自从2010年出现以来,它助使Python成为强大而高效的数据分析环境。pandas用的最多对象是DataFrame,它是一个面向列(column-oriented)的二维表结构,另一个是Series,一个一维的标签化数组对象。 pandas兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库(如SQL)灵活的数据处理功能。它提供了复杂精细的索引功能,以便更为便捷地完成重塑、切片和切块、聚合以及选取数据子集等操作。因为数据操作、准备、清洗是数据分析最重要的技能,pandas是数据分析很重要的一个库。
matplotlib是最流行的用于绘制图表和其它二维数据可视化的Python库。它最初由John D.Hunter(JDH)创建,目前由一个庞大的开发人员团队维护。它非常适合创建出版物上用的图表。虽然还有其它的Python可视化库,matplotlib却是使用最广泛的,并且它和其它生态工具配合也非常完美。我认为,可以使用它作为默认的可视化工具。
IPython项目起初是Fernando Pérez在2001年的一个用以加强和Python交互的子项目。在随后的16年中,它成为了Python数据栈最重要的工具之一。虽然IPython本身没有提供计算和数据分析的工具,它却可以大大提高交互式计算和软件开发的生产率。IPython鼓励“执行-探索”的工作流,区别于其它编程软件的“编辑-编译-运行”的工作流。它还可以方便地访问系统的shell和文件系统。因为大部分的数据分析代码包括探索、试错和重复, IPython可以使工作更快。 2014年,Fernando和IPython团队宣布了Jupyter项目,一个更宽泛的多语言交互计算工具的计划。IPython web notebook变成了Jupyter notebook,现在支持40种编程语言。IPython现在可以作为Jupyter使用Python的内核(一种编程语言模式)。 IPython变成了Jupyter庞大开源项目(一个交互和探索式计算的有效环境)中的一个组件。它最老也是最简单的模式,现在是一个用于编写、测试、调试Python代码的强化shell。你还可以使用通过Jupyter Notebook,一个支持多种语言的交互式网络代码“笔记本”,来使用IPython。IPython shell 和Jupyter notebooks特别适合进行数据探索和可视化。Jupyter notebooks还可以编写Markdown和HTML内容,提供了一种创建代码和文本的富文本方法。其它编程语言也在Jupyter中植入了内核,好让在Jupyter中可以使用Python另外的语言。 对我个人而言,我的大部分Python都要用到IPython,包括运行、调试和测试代码。
SciPy是一组专门解决科学计算中各种标准问题域的包的集合,主要包括下面这些包: (1)scipy.integrate:数值积分例程和微分方程求解器。 (2)scipy.linalg:扩展了由numpy.linalg提供的线性代数例程和矩阵分解功能。 (3)scipy.optimize:函数优化器(最小化器)以及根查找算法。 (4)scipy.signal:信号处理工具。 (5)scipy.sparse:稀疏矩阵和稀疏线性系统求解器。 (6)scipy.special:SPECFUN(这是一个实现了许多常用数学函数(如伽玛函数)的Fortran库)的包装器。 (7)scipy.stats:标准连续和离散概率分布(如密度函数、采样器、连续分布函数等)、各种统计检验方法,以及更好的描述统计法。 NumPy和SciPy结合使用,便形成了一个相当完备和成熟的计算平台,可以处理多种传统的科学计算问题。
2010年诞生以来,scikit-learn成为了Python的通用机器学习工具包。仅仅七年,就汇聚了全世界超过1500名贡献者。它的子模块包括: (1)分类:SVM、近邻、随机森林、逻辑回归等等。 (2)回归:Lasso、岭回归等等。 (3)聚类:k-均值、谱聚类等等。 (4)降维:PCA、特征选择、矩阵分解等等。 (5)选型:网格搜索、交叉验证、度量。 (6)预处理:特征提取、标准化。 与pandas、statsmodels和IPython一起,scikit-learn对于Python成为高效数据科学编程语言起到了关键作用。
statsmodels是一个统计分析包,起源于斯坦福大学统计学教授Jonathan Taylor,他设计了多种流行于R语言的回归分析模型。Skipper Seabold和Josef Perktold在2010年正式创建了statsmodels项目,随后汇聚了大量的使用者和贡献者。受到R的公式系统的启发,Nathaniel Smith发展出了Patsy项目,它提供了statsmodels的公式或模型的规范框架。 与scikit-learn比较,statsmodels包含经典统计学和经济计量学的算法。包括如下子模块: (1)回归模型:线性回归,广义线性模型,健壮线性模型,线性混合效应模型等等。 (2)方差分析(ANOVA)。 (3)时间序列分析:AR,ARMA,ARIMA,VAR和其它模型。 (4)非参数方法: 核密度估计,核回归。 (5)统计模型结果可视化。 statsmodels更关注与统计推断,提供不确定估计和参数p-值。相反的,scikit-learn注重预测。