第5章Python数据分析基础库本章学习目标:学习NumPy库的用法、数据结构和基本操作学习Pandas库的用法、数据结构和基本操作学习Matplotlib库的用法、数据结构和基本操作掌握SciPy库的操作、作用掌握Scikitlearn库的操作、作用本章介绍Python进行数据分析时常用的NumPy、Pandas、Matplotlib、SciPy和Scikitlearn基础库。NumPy是Python的一种开源数值计算扩展库,这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nestedliststructure)结构要高效许多;Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的,Pandas提供了大量的库和标准数据模型,以及高效、便捷地处理大型数据集所需的函数和方法;Matplotlib是一个Python的2D绘图库,它基于各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形;SciPy是一款方便的专为科学和工程设计的Python工具包,包括统计、优化、整合、线代数模块、傅里叶变换、信号和图像处理以及常微分方程求解器等;Scikitlearn(简称Sklearn)是SciPy的扩展,建立在NumPy和Matplotlib库的基础之上,支持分类、回归、降维和聚类等机器学习算法。
5.1NumPyNumPy(NumericalPython的缩写)是一个开源的Python科学计算库,包含很多实用的数学函数,涵盖线代数运算、傅里叶变换和随机数生成等功能。NumPy允许用户进行快速的交互式原型设计,可以很自然地使用数组和矩阵。它的部分功能如下。
(1)ndarray:一个具有矢量算术运算且节省空间的多维数组。
(2)用于对整组数据进行快速运算的标准数学函数(无须编写循环)。
(3)用于读/写磁盘数据的工具以及用于操作存映文件的工具。
(4)线代数、随机数生成以及傅里叶变换功能。
(5)用于集成C、C++、Fortran等语言的代码编写工具。
NumPy的底层算法在设计时就有着优异的能,对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多。对于大型数组的运算,使用NumPy中数组的存储效率和输入/输出能均优于Python中等价的基本数据结构(例如嵌套的list容器)。对于TB级的大文件,NumPy使用存映文件来处理,以达到的数据读/写能。这是因为NumPy能够直接对数组和矩阵进行操作,可以省略很多循环语句,其众多的数学函数也会让开发人员编写代码的工作轻松许多。不过NumPy数组的通用不及Python提供的list容器,这是其不足之处。因此,在科学计算之外的领域,NumPy的优势也就不那么明显了。NumPy本身没有提供那么多高级的数据分析功能,理解NumPy数组以及面向数组的计算将有于更加高效地使用诸如Pandas之类的工具。下面对NumPy的数据结构和操作进行介绍。
NumPy的多维数组对象ndarray是一个快速、灵活的大数据集容器。用户可以利用这种数组对象对整块数据进行数学运算,其运算跟标量元素之间的运算一样。创建ndarray数组简单的办法就是使用array()函数。它接受一切序列型的对象(包括数组),然后产生一个新的、含有传入数据的NumPy数组。这里以一个列表的转换为例:In[1]:importnumpyasnpdata=[6,7.5,8,0,1]arr1=np.array(data)arr1Out[1]:array([6.,7.5,8.,0.,1.])ndarray是一个通用的同构数据多维容器,其中所有的元素必须是相同类型的。每一个数组都有一个shape(表示维度大小的数组)和一个dtype(用于说明数组数据类型的对象):In[2]:arr1.shapeOut[2]:(5,)In[3]:arr1.dtypeOut[3]:dtype(''float64'')嵌套序列(例如由一组等长列表组成的列表)将会被转换成一个多维数组:In[4]:data2=[[1,,,4],[5,6,7,8]]arr2=np.array(data2)arr2Out[4]:array([[1,,,4],[5,6,7,8]])In[5]:arr2.ndimOut[5]:2In[6]:arr2.shapeOut[6]:(2,4)除非显式说明,否则np.array()会尝试为新建的数组推断出一个较为合适的数据类型。数据类型保存在一个特殊的dtype对象中,例如上面的两个例子:In[7]:arr1.dtypeOut[7]:dtype(''float64'')In[8]:arr2.dtypeOut[8]:dtype(''int32'')除了np.array()外,还有一些函数可以新建数组,例如np.zeros()和np.ones()可以分别创建指定长度或形状的全为0或全为1的数组。Empty可以创建一个没有任何具体数值的数组。如果要用这些方法创建数组,只需传入一个表示形状的元组即可:In[9]:np.zeros(8)Out[9]:array([0.,0.,0.,0.,0.,0.,0.,0.])In[10]:np.zeros((2,4))Out[10]:array([[0.,0.,0.,0.],[0.,0.,0.,0.]])In[11]:np.empty((,,2))Out[11]:array([[[9.78249979e-322,0.00000000e+000],[0.00000000e+000,0.00000000e+000],[0.00000000e+000,0.00000000e+000]],[[0.00000000e+000,0.00000000e+000],[0.00000000e+000,0.00000000e+000],[0.00000000e+000,0.00000000e+000]]])在NumPy中,np.empty()会认为返回全为0的数组是不安全的,所以它会返回一些未初始化的很接近0的随机值。
ndarray的一些常用的基本数据操作函数如表5.1所示。
表5.1ndarray基本数据操作函数函数说明array()将输入数据(列表、元组、数组或序列类型)转换为ndarray。推断出dtype或特别指定dtype,默认直接赋值输入数据asarray()将输入转化为ndarray。如果输入本身是一个ndarray,就不再复制arange()类似于内置的range,但返回的是一个ndarray而非listones(),ones_like()根据指定的形状和dtype创建一个全1数组。ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1数组zeros(),zeros_like()类似于ones()和ones_like(),只不过产生的是全0数组empty(),empty_like()创建新数组,只分配内存空间,不填充任何值
full(),full_like()用fullvalue中的所有值,根据指定的形状和dtype创建一个数组。full_like()使用另一个数组,用相同的形状和dtype创建eye(),identity()创建一个正方的N×N矩阵(对角线为1,其余为0)