DAY 18

numpy模块

numpy是Python的是一种开源的数值计算扩展库。这种库可以用来存储和处理大型numpy数组,比如Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。

numpy库也两个作用:

  1. 区别于list列表,提供了数组操作、数组运算、以及统计发布和简单的数学模型
  2. 计算速度快,甚至要由于Python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。

为什么用numpy

lis1 = [1, 2, 3]
lis2 = [4, 5, 6]
lis1

[1, 2, 3]

lis2

[4, 5, 6]

如果我们想让 lis1 * lis2 得到一个结果为lis_res = [4, 10, 18],非常复杂。

创建numpy数组

numpy数组即numpy的ndarray对象,创建numpy数组就是把一个列表传入np.array()方法。

import numpy as np
# np.array?  相当于pycharmd的ctrl+鼠标左键 
# 创建一维的ndarray对象
arr = np.array([1, 2, 3])
print(arr, type(arr))

[1 2 3] < class 'numpy.ndarray'>

# 创建二维的ndarray对象
print(np.array([1, 2, 3], [4, 5, 6]))

[[1 2 3]

[4 5 6]]

#  创建三维的ndarray对象
print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))

[[1 2 3]

[4 5 6]

[7 8 9]]

numpy数组的常用属性

属性 解释
T 数组的转置(对高维数组而言)
dtype 数组元素的数据类型
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
astype 类型转换

dtype种类:bool_,int(8, 16, 32, 64), float(16, 32, 64)

arr = np.array([[1, 2, 3], [4, 5, 6]], dtype = np.float32)
print(arr)

[[1. 2. 3.]

[4. 5. 6.]]

print(arr.T)

[[1. 4.]

[2. 5.]

[3. 6.]]

print(arr.dtype)

float32

arr = arr.astype(np.int32)
print(arr.dtype)
print(arr)

int32

[[1 2 3]

[4 5 6]]

print(arr.size)

6

print(arr.ndim)

2

print(arr.shape)

(2, 3)

获取numpy数组的行列数

由于numpy数组是多维的,对于二维的数组而言,numpy数组就是既有行又有列。

注意:对于numpy我们一般多讨论二维的数组。

切割numpy数组

切分numpy数组类似于列表的切割,但是与列表的切割不同的是,numpy数组的切割涉及到行列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。

numpy数组元素替换

numpy数组元素的替换,类似于列表元素的替换,并且numpy数组也是一个可变类型的数据,即如果对numpy数组进行替换操作,会修改原numpy数组的元素,所以下面我们用.copy()方法举例numpy数组元素的替换。

numpy数组的合并

合并两个numpy数组的行,注意使用hstack()方法合并numpy数组,numpy数组应该有相同的行,其中hstack的h表示horizontal水平的,其中axis=1表示合并两个numpy数组的行,合并两个numpy数组的列,注意使用vstack()方法合并numpy数组,numpy数组应该有相同的列,其中vstack的v表示vertical垂直的,其中axis=0表示合并两个numpy数组的列

通过函数创建numpy数组

方法 详解
array() 将列表转换为数组,可选择显式指定dtype
arange() range的numpy版,支持浮点数
linspace() 类似arange(),第三个参数为数组长度
zeros() 根据指定形状和dtype创建全0数组
ones() 根据指定形状和dtype创建全1数组
eye() 创建单位矩阵
empty() 创建一个元素全随机的数组
reshape() 重塑形状

numpy数组运算

运算符 说明
+ 两个numpy数组对应元素相加
- 两个numpy数组对应元素相减
* 两个numpy数组对应元素相乘
/ 两个numpy数组对应元素相除,如果都是整数则取商
% 两个numpy数组对应元素相除后取余数
**n 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方

numpy数组运算函数

numpy数组函数 详解
np.sin(arr) 对numpy数组arr中每个元素取正弦,sin(x)sin(x)
np.cos(arr) 对numpy数组arr中每个元素取余弦,cos(x)cos(x)
np.tan(arr) 对numpy数组arr中每个元素取正切,tan(x)tan(x)
np.arcsin(arr) 对numpy数组arr中每个元素取反正弦,arcsin(x)arcsin(x)
np.arccos(arr) 对numpy数组arr中每个元素取反余弦,arccos(x)arccos(x)
np.arctan(arr) 对numpy数组arr中每个元素取反正切,arctan(x)arctan(x)
np.exp(arr) 对numpy数组arr中每个元素取指数函数,exex
np.sqrt(arr) 对numpy数组arr中每个元素开根号x−−√

numpy数组矩阵化

numpy数组的点乘

numpy数组的点乘必须满足第一个numpy数组的列数等于第二个numpy数组的行数,即m∗n⋅n∗m=m∗mm∗n·n∗m=m∗m。

numpy数组的转置

numpy数组的转置,相当于numpy数组的行和列互换。

numpy数组的逆

numpy数组行和列相同时,numpy数组才可逆。

numpy数组数学和统计方法

方法 详解
sum 求和
cumsum 累加求和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
sort 排序

numpy.random生成随机数

函数名称 函数功能 参数说明
rand(d0,d1,⋯,dnd0,d1,⋯,dn) 产生均匀分布的随机数 dndn为第n维数据的维度
randn(d0,d1,⋯,dnd0,d1,⋯,dn) 产生标准正态分布随机数 dndn为第n维数据的维度
randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
random_sample([size]) 在[0,1)[0,1)内产生随机数 size为随机数的shape,可以为元祖或者列表
choice(a[, size]) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
uniform(low,high [,size]) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
shuffle(a) 与random.shuffle相同 a为指定数组

pandas模块

pandas基于Numpy,可以看成是处理文本或者表格数据。pandas中有两个主要的数据结构,其中Series数据结构类似于Numpy中的一维数组,DataFrame类似于多维表格数据结构。

pandas是python数据分析的核心模块。它主要提供了五大功能:

  1. 支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
  2. 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
  3. 支持多表拼接合并操作。
  4. 支持简单的绘图操作。
  5. 支持简单的统计分析操作。

Series数据结构

Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。

Series比较像列表(数组)和字典的结合体

Series支持NumPy模块的特性(下标)

详解 方法
从ndarray创建Series Series(arr)
与标量运算 df*2
两个Series运算 df1+df2
索引 df[0], df[[1,2,4]]
切片 df[0:2]
通用函数 np.abs(df)
布尔值过滤 df[df>0]

Series支持字典的特性(标签)

详解 方法
从字典创建Series Series(dic),
in运算 ’a’ in sr
键索引 sr['a'], sr[['a', 'b', 'd']]

Series缺失数据处理

方法 详解
dropna() 过滤掉值为NaN的行
fillna() 填充缺失数据
isnull() 返回布尔数组,缺失值对应为True
notnull() 返回布尔数组,缺失值对应为False

DataFrame数据结构

DataFrame是一个表格型的数据结构,含有一组有序的列。

DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

产生时间对象数组:date_range

参数 详解
start 开始时间
end 结束时间
periods 时间长度
freq 时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),…

DataFrame属性

属性 详解
dtype是 查看数据类型
index 查看行序列或者索引
columns 查看各列的标签
values 查看数据框内的数据,也即不含表头索引的数据
describe 查看数据每一列的极值,均值,中位数,只可用于数值型数据
transpose 转置,也可用T来操作
sort_index 排序,可按行或列index排序输出
sort_values 按数据值来排序

DataFrame取值

loc(通过行标签取值)

iloc(类似于numpy数组取值)

使用逻辑判断取值

DataFrame值替换

读取CSV文件

处理丢失数据

合并数据

导入导出数据

使用df = pd.read_excel(filename)读取文件,使用df.to_excel(filename)保存文件。

读取文件导入数据

读取文件导入数据函数主要参数:

参数 详解
sep 指定分隔符,可用正则表达式如'\s+'
header=None 指定文件无行名
name 指定列名
index_col 指定某列作为索引
skip_row 指定跳过某些行
na_values 指定某些字符串表示缺失值
parse_dates 指定某些列是否被解析为日期,布尔值或列表

写入文件导出数据

写入文件函数的主要参数:

参数 详解
sep 分隔符
na_rep 指定缺失值转换的字符串,默认为空字符串
header=False 不保存列名
index=False 不保存行索引
cols 指定输出的列,传入列表

pandas读取ison文件

orient参数的五种形式

orient是表明预期的json字符串格式。orient的设置有以下五个值:

  1. 'split' : dict like

这种就是有索引,有列字段,和数据矩阵构成的json格式。key名称只能是index,columns和data。

  1. 'records' : list like [{column -> value}, ... , {column -> value}]

这种就是成员为字典的列表。如我今天要处理的json数据示例所见。构成是列字段为键,值为键值,每一个字典成员就构成了dataframe的一行数据。

  1. 'index' : dict like {index -> {column -> value}}

以索引为key,以列字段构成的字典为键值。

  1. 'columns' : dict like {column -> {index -> value}}

这种处理的就是以列为键,对应一个值字典的对象。这个字典对象以索引为键,以值为键值构成的json字符串。

  1. 'values' : just the values array。

values这种我们就很常见了。就是一个嵌套的列表。里面的成员也是列表,2层的。

pandas读取sql语句