表1:通用一元函数
函数 | 说明 |
---|---|
abs / fabs |
求绝对值的函数 |
sqrt |
求平方根的函数,相当于array ** 0.5 |
square |
求平方的函数,相当于array ** 2 |
exp |
计算 e x e^x ex的函数 |
log / log10 / log2 |
对数函数(e 为底 / 10 为底 / 2 为底) |
sign |
符号函数(1 - 正数;0 - 零;-1 - 负数) |
ceil / floor |
上取整 / 下取整 |
isnan |
返回布尔数组,NaN对应True ,非NaN对应False |
isfinite / isinf |
判断数值是否为无穷大的函数 |
cos / cosh / sin |
三角函数 |
sinh / tan / tanh |
三角函数 |
arccos / arccosh / arcsin |
反三角函数 |
arcsinh / arctan / arctanh |
反三角函数 |
rint / round |
四舍五入函数 |
表2:通用二元函数
函数 | 说明 |
---|---|
add(x, y) / substract(x, y) |
加法函数 / 减法函数 |
multiply(x, y) / divide(x, y) |
乘法函数 / 除法函数 |
floor_divide(x, y) / mod(x, y) |
整除函数 / 求模函数 |
allclose(x, y) |
检查数组x 和y 元素是否几乎相等 |
power(x, y) |
数组 x x x的元素 x i x_i xi和数组 y y y的元素 y i y_i yi,计算 x i y i x_i^{y_i} xiyi |
maximum(x, y) / fmax(x, y) |
两两比较元素获取最大值 / 获取最大值(忽略NaN) |
minimum(x, y) / fmin(x, y) |
两两比较元素获取最小值 / 获取最小值(忽略NaN) |
inner(x, y) |
内积运算 |
cross(x, y) / outer(x, y) |
叉积运算 / 外积运算 |
intersect1d(x, y) |
计算x 和y 的交集,返回这些元素构成的有序数组 |
union1d(x, y) |
计算x 和y 的并集,返回这些元素构成的有序数组 |
in1d(x, y) |
返回由判断x 的元素是否在y 中得到的布尔值构成的数组 |
setdiff1d(x, y) |
计算x 和y 的差集,返回这些元素构成的数组 |
setxor1d(x, y) |
计算x 和y 的对称差,返回这些元素构成的数组 |
补充说明:在二维空间内,两个向量 A = [ a 1 a 2 ] \boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \end{bmatrix} A=[a1a2]和 B = [ b 1 b 2 ] \boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \end{bmatrix} B=[b1b2]的叉积是这样定义的: A × B = ∣ a 1 a 2 b 1 b 2 ∣ = a 1 b 2 − a 2 b 1 \boldsymbol{A}\times \boldsymbol{B}=\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}=a_1b_2 - a_2b_1 A×B=∣∣∣∣a1a2b1b2∣∣∣∣=a1b2−a2b1,其中 ∣ a 1 a 2 b 1 b 2 ∣ \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} ∣∣∣∣a1a2b1b2∣∣∣∣称为行列式。但是一定要注意,叉积并不等同于行列式,行列式的运算结果是一个标量,而叉积运算的结果是一个向量。如果不明白,我们可以看看三维空间两个向量, A = [ a 1 a 2 a 3 ] \boldsymbol{A}=\begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} A=⎣⎡a1a2a3⎦⎤和 B = [ b 1 b 2 b 3 ] \boldsymbol{B}=\begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} B=⎣⎡b1b2b3⎦⎤的叉积是 < i ^ ∣ a 2 a 3 b 2 b 3 ∣ , − j ^ ∣ a 1 a 3 b 1 b 3 ∣ , k ^ ∣ a 1 a 2 b 1 b 2 ∣ > \left< \hat{i} \begin{vmatrix} a_2 \quad a_3 \\ b_2 \quad b_3 \end{vmatrix}, -\hat{j} \begin{vmatrix} a_1 \quad a_3 \\ b_1 \quad b_3 \end{vmatrix}, \hat{k} \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} \right> ⟨i^∣∣∣∣a2a3b2b3∣∣∣∣,−j^∣∣∣∣a1a3b1b3∣∣∣∣,k^∣∣∣∣a1a2b1b2∣∣∣∣⟩,其中 i ^ , j ^ , k ^ \hat{i}, \hat{j}, \hat{k} i^,j^,k^代表每个维度的单位向量。
表3:NumPy其他常用函数
函数 | 说明 |
---|---|
unique |
去除数组重复元素,返回唯一元素构成的有序数组 |
copy |
返回拷贝数组得到的数组 |
sort |
返回数组元素排序后的拷贝 |
split / hsplit / vsplit |
将数组拆成若干个子数组 |
stack / hstack / vstack |
将多个数组堆叠成新数组 |
concatenate |
沿着指定的轴连接多个数组构成新数组 |
append / insert |
向数组末尾追加元素 / 在数组指定位置插入元素 |
argwhere |
找出数组中非0元素的位置 |
extract / select / where |
按照指定的条件从数组中抽取或处理数组元素 |
flip |
沿指定的轴翻转数组中的元素 |
fromiter |
通过迭代器创建数组对象 |
fromregex |
通过读取文件和正则表达式解析获取数据创建数组对象 |
repeat / tile |
通过对元素的重复来创建新数组 |
roll |
沿指定轴对数组元素进行移位 |
resize |
重新调整数组的大小 |
place / put |
将数组中满足条件的元素/指定的元素替换为指定的值 |
ptp |
沿指定的轴计算极差(最大值与最小值的差) |
median |
沿指定轴计算中位数 |
partition |
用选定的元素对数组进行一次划分并返回划分后的数组 |
提示:上面的
resize
函数和ndarray
对象的resize
方法是有区别的,resize
函数在调整数组大小时会重复数组中的元素作为填补多出来的元素的值,而ndarry
对象的resize
方法是用0来填补多出来的元素。这些小细节不清楚暂时也不要紧,但是如果用到对应的功能了就要引起注意。
属性 | 说明 |
---|---|
A |
获取矩阵对象对应的ndarray 对象 |
A1 |
获取矩阵对象对应的扁平化后的ndarray 对象 |
I |
可逆矩阵的逆矩阵 |
T |
矩阵的转置 |
H |
矩阵的共轭转置 |
shape |
矩阵的形状 |
size |
矩阵元素的个数 |
函数 | 说明 |
---|---|
diag |
以一维数组的形式返回方阵的对角线元素或将一维数组转换为方阵(非对角元素元素为0) |
vdot |
向量的点积 |
dot |
数组的点积 |
inner |
数组的内积 |
outer |
数组的叉积 |
trace |
计算对角线元素的和 |
norm |
求模(范数)运算 |
det |
计算行列式的值(在方阵上计算会得到一个标量) |
matrix_rank |
计算矩阵的秩 |
eig |
计算矩阵的特征值(eigenvalue)和特征向量(eigenvector) |
inv |
计算非奇异矩阵( n n n阶方阵)的逆矩阵 |
pinv |
计算矩阵的摩尔-彭若斯(Moore-Penrose)广义逆 |
qr |
QR分解(把矩阵分解成一个正交矩阵与一个上三角矩阵的积) |
svd |
计算奇异值分解(singular value decomposition) |
solve |
解线性方程组 A x = b \boldsymbol{A}\boldsymbol{x}=\boldsymbol{b} Ax=b,其中 A \boldsymbol{A} A是一个方阵 |
lstsq |
计算 A x = b \boldsymbol{A}\boldsymbol{x}=\boldsymbol{b} Ax=b的最小二乘解 |
Series对象的常用属性如下表所示。
属性 | 说明 |
---|---|
dtype / dtypes |
返回Series 对象的数据类型 |
hasnans |
判断Series 对象中有没有空值 |
at / iat |
通过索引访问Series 对象中的单个值 |
loc / iloc |
通过一组索引访问Series 对象中的一组值 |
index |
返回Series 对象的索引 |
is_monotonic |
判断Series 对象中的数据是否单调 |
is_monotonic_increasing |
判断Series 对象中的数据是否单调递增 |
is_monotonic_decreasing |
判断Series 对象中的数据是否单调递减 |
is_unique |
判断Series 对象中的数据是否独一无二 |
size |
返回Series 对象中元素的个数 |
values |
以ndarray 的方式返回Series 对象中的值 |
提示:因为
describe()
返回的也是一个Series
对象,所以也可以用ser2.describe()['mean']
来获取平均值。
如果Series
对象有重复的值,我们可以使用unique()
方法获得去重之后的Series
对象;可以使用nunique()
方法统计不重复值的数量;如果想要统计每个值重复的次数,可以使用value_counts()
方法,这个方法会返回一个Series
对象,它的索引就是原来的Series
对象中的值,而每个值出现的次数就是返回的Series
对象中的数据,在默认情况下会按照出现次数做降序排列。
DataFrame
对象可以通过pandas
模块的read_csv
函数来读取 CSV 文件,read_csv
函数的参数非常多,下面接受几个比较重要的参数。
sep
/ delimiter
:分隔符,默认是,
。header
:表头(列索引)的位置,默认值是infer
,用第一行的内容作为表头(列索引)。index_col
:用作行索引(标签)的列。usecols
:需要加载的列,可以使用序号或者列名。true_values
/ false_values
:哪些值被视为布尔值True
/ False
。skiprows
:通过行号、索引或函数指定需要跳过的行。skipfooter
:要跳过的末尾行数。nrows
:需要读取的行数。na_values
:哪些值被视为空值。DataFrame
对象可以通过pandas
模块的read_excel
函数来读取 Exce l文件,该函数与上面的read_csv
非常相近,多了一个sheet_name
参数来指定数据表的名称,但是不同于 CSV 文件,没有sep
或delimiter
这样的参数。下面的代码中,read_excel
函数的skiprows
参数是一个 Lambda 函数,通过该 Lambda 函数指定只读取 Excel 文件的表头和其中10%的数据,跳过其他的数据。
DataFrame
对象pandas
模块的read_sql
函数可以通过 SQL 语句从数据库中读取数据创建DataFrame
对象,该函数的第二个参数代表了需要连接的数据库。对于 MySQL 数据库,我们可以通过pymysql
或mysqlclient
来创建数据库连接,得到一个Connection
对象,而这个对象就是read_sql
函数需要的第二个参数。
提示:执行上面的代码需要先安装
pymysql
库,如果尚未安装,可以先在 Notebook 的单元格中先执行!pip install pymysql
,然后再运行上面的代码。上面的代码连接的是我部署在阿里云上的 MySQL 数据库,公网 IP 地址:数据库ip
,用户名:用户名称
,密码:数据库密码
,数据库:数据库名称
,表名:表名
,字符集:utf8mb4
,大家可以使用这个数据库,但是不要进行恶意的访问。
说明:在数据库中
mgr
和comm
两个列的数据类型是int
,但是因为有缺失值(空值),读取到DataFrame
之后,列的数据类型变成了float
,因为我们通常会用float
类型的NaN
来表示空值。
DataFrame
对象的属性如下表所示。
属性名 | 说明 |
---|---|
at / iat |
通过标签获取DataFrame 中的单个值。 |
columns |
DataFrame 对象列的索引 |
dtypes |
DataFrame 对象每一列的数据类型 |
empty |
DataFrame 对象是否为空 |
loc / iloc |
通过标签获取DataFrame 中的一组值。 |
ndim |
DataFrame 对象的维度 |
shape |
DataFrame 对象的形状(行数和列数) |
size |
DataFrame 对象中元素的个数 |
values |
DataFrame 对象的数据对应的二维数组 |
关于DataFrame
的方法,首先需要了解的是info()
方法,它可以帮助我们了解DataFrame
的相关信息。
有的时候,我们做数据分析需要的原始数据可能并不是来自一个地方,就像上面的例子中,我们从关系型数据库中读取了三张表,得到了三个DataFrame
对象,但实际工作可能需要我们把他们的数据整合到一起。例如:df
和df2
其实都是员工的数据,而且数据结构完全一致,我们可以使用pandas
提供的concat
函数实现两个或多个DataFrame
的数据拼接,代码如下所示。
通常,我们从 Excel、CSV 或数据库中获取到的数据并不是非常完美的,里面可能因为系统或人为的原因混入了重复值或异常值,也可能在某些字段上存在缺失值;再者,DataFrame
中的数据也可能存在格式不统一、量纲不统一等各种问题。因此,在开始数据分析之前,对数据进行清洗就显得特别重要。
可以使用DataFrame
对象的isnull
或isna
方法来找出数据表中的缺失值。