第一章 NumPy基础:数组和矢量计算
1.Numerical
Python是高性能科学计算和数据分析的基础包。它提供了一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组ndarray;用于对整组数据进行快速运算的标准数学函数(无需编写循环);用于读写磁盘数据的工具以及用于操作内存映射文件的工具;线性代数、随机数生成以及傅里叶变换功能;用于集成由C、C++、Fortran等语言编写的代码的工具;提供了一个简单易用的CAPI。
2.NumPy最重要的特点就是其N维数组对象(即ndarray),是一个快速灵活的大数据集容器;是一个通用的同构数据多维容器,即所有元素必须为相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)。
3.ndarray的创建,array函数,zeros函数,ones函数,empty函数,arange函数(注意与range和xrange函数的区别),eye和identity函数。
4.ndarray的数据类型,dtype,也可以通过astype函数转换数组的类型。注意:调用astype无论如何都会创建出一个新的数组(原始数据的一份拷贝),即使新dtype与老dtype相同也是如此。
5.数组和标量之间的运算,不用编写循环就可以对数据执行批量运算,即矢量化。大小相等的数组之间的任何算术运算都会将运算应用到元素级;数组与标量之间的运算也会将那个标量传播到各个元素;不同大小的数组之间的运算叫做广播(broadcasting)。
6.数组基本的索引和切片。当将一个标量值赋值给一个切片时(如arr[5:8]=
12),该值会自动传播到整个选区。跟列表最重要的区别在于,数组切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会直接映射到源数组上。由于NumPy的设计目的是处理大数据,所以可以想象,假如NumPy坚持要将数据复制来复制去的话会产生何等的性能和内存的问题。也可以显式地进行复制操作,例如arr[5:8].copy()。二维数组元素的索引访问的两种方式,例如arr[0][2],arr[0,2]。切片索引;布尔型索引,通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此;花式索引(Fancyindexing),花式索引跟切片不一样,它总是将数据复制到新数组中。
7.数组转置和轴对称。转置(transpose)是重塑的一种特殊形式,它返回的是数据的视图(不会进行任何复制操作),tanspose方法和T属性,swapaxes方法。
8.通用函数(ufunc):快速的元素级数组函数。一些一元ufunc和一些二元ufunc。
9.利用数组进行数据处理,用数组表达式代替循环的做法,通常被称为矢量化。(1)将条件逻辑表述为数组运算,numpy.where(condition, x ,
y)函数是三元表达式xif condition else y的矢量化版本;(2)数学和统计方法,例如numpy.sum(arr, axis =
0)函数(也可写成arr.sum(axis =
0)),还有一些其他的函数,如mean,std,var,min(注意与通用函数minimum的区别),max(注意与通用函数maximum的区别),argmin,argmax,cumsum,cumprod;(3)用于布尔型数组的方法,例如:arr=
randn(100),(arr >
0).sum(),另外还有两个方法,any和all,这两个方法也能用于非布尔型数组,所有非0元素将会被当做True;(4)排序,arr.sort(1)为在第1维上的就地排序,会修改原数组本身,而顶级方法numpy.sort(1)为在第1维上的复制排序,返回的是数组的已排序副本,利用排序后的数组可以计算数组的百分位数;(5)唯一化以及其他的集合逻辑,numpy提供了一些针对一维ndarray的基本集合运算,最常用的numpy.unique()函数,与sorted(set())的功能类似,numpy.in1d函数用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组,其他方法例如intersect1d(x,y),union1d(x,y),setdiff1d(x,y),setxor1d(x,y)。
10.用于数组的文件输入输出。(1)将数组以二进制格式保存到磁盘,numpy.save,numpy.load,数组文件格式为.npy,将多个数组保存到一个压缩文件中numpy.savez,numpy.load,数组文件格式为.npz;(2)存取文本文件,NumPy中提供numpy.loadtxt,numpy.savetxt,numpy.genfromtxt。
11.线性代数。NumPy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间中的一个函数),numpy.linalg库中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西,例如diag,trace,det,eig,inv,svd,solve。
12.随机数生成。numpy.random模块提供了一些用于高效生成多种概率分布的样本值的函数。例如:rand(均匀分布),randint(随机整数),randn(正态分布),binomial(二项分布),normal(正态分布),beta(Beta分布),chisquare(卡方分布),gamma(Gamma分布),uniform(在[0,1]之间均匀分布)。
第二章 pandas入门
1.pandas的两个主要数据结构:Series和DataFrame。
2.Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。Series的字符串表现形式为:索引在左边,值在右边。可通过Series的values和index属性来获取其值和索引对象。在创建Series的时候可以通过index作为关键字参数手动指定每个值的索引。可通过索引的方式选取Series中的单个或一组值。Series类型的对象进行的运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接。Series可以被看成是一个
定长 的 有序
字典(注意与字典的区别),因为它是索引值到数据值的一个映射。如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series。pandas中的isnull和notnull函数(Series对象也可直接使用这两个函数)可用于检测缺失数据。Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。Series对象本身及其索引都有一个name属性。Series的索引可以通过赋值的方式就地修改。
3.DataFrame是一个表格型的数据结构。它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引。构建DataFrame最常用的一种方法是直接传入一个由等长列表或NumPy数组组成的字典。如果指定了列序列(通过关键字参数columns指定),则DataFrame的列就会按照指定顺序进行排列,当然也可以指定行索引(通过关键字参数index指定)。跟Series一样,如果传入的列在数据中找不到,就会自动产生NaN值。通过类似字典标记的方式或者属性的方式,可以将DataFrame的列获取为一个Series。行也可以通过位置或名称的方式进行获取,比如用索引字段ix。列可以通过赋值的方式进行修改,将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配,如果赋值的是一个Series,就会精确匹配DataFrame的索引。为不存在的列赋值会创建一个新列。关键字del用于删除列。另一种常见的数据形式是嵌套字典,外层字典的键作为列,内层键则作为行索引。可以设置DataFrame的index和columns的name属性。DataFrame的values属性会以二维ndarray的形式返回DataFrame中的数据。
4.索引对象。pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。Index对象是不可修改的(immutable),因此用户不能对其进行修改,不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享。
5.重新索引。pandas的一个重要方法reindex,作用是创建一个适应新索引的新对象。例如调用Series的reindex方法将会根据新索引进行重排,如果某个索引值当前不存在,就引入缺失值或者用关键字参数fill_value指定。对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理,关键字参数method选项即可达到此目的。对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。如果仅传入一个序列,则会重新索引行,使用columns关键字参数即可重新索引列,也可以同时对行和列进行重新索引,而插值则只能按行应用(即轴0)。利用ix的标签索引功能,重新索引任务可以变得更简洁。