Matplotlib
##2.1matplotlib之HelloWorld
2.1.1什么是matplotlob
专门用于开发2D(3D)图标
使用起来简单
以渐进、交互方式实现数据可视化
数据可视化——帮助理解数据,方便选择更适合的分析方法
js库: D3 echarts
matplotlib图像结构
matplotlib三层结构
1、容器层
画板层(Canvas ):位于最底层,用户一般接触不到
画布层(FIgure) :plt.figure() 建立在Canvas之上
绘图区(AXES)、坐标系(axis) pil.subplots()
x、y轴张成的区域
2、辅助显示层
3、图像层
根据函数绘制图像
折线图绘制(plot)与基础绘图功能
基本步骤
1、创建画布
2、绘制图像
3、显示图像
1 |
|
完善原始折线图(辅助显示层)
1 |
|
1 |
|
多个坐标系显示-plt.subplots(面向对象的画图方法)
1 |
|
常见图形种类及意义
折线图plot
散点图scatter
关系/规律
柱状图bar
统计/对比
直方图histogram
分布状况
饼图pie
占比
散点图绘制
1 |
|
柱状图绘制
1 |
|
1 |
|
直方图
组数:在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数称为组数
组距:每一组两个端点的差
1 |
|
饼图
1 |
|
3.Numpy
高效的运算工具
3.1 Numpy介绍 数值计算库
ndarray优势
1)存储风格
ndarray – 相同类型 – 通用性不强
list – 不同类型 – 通用性很强
2)并行化运算
ndarray支持向量化运算
3)底层语言
3.2.1ndarray属性
属性名字 | 属性解释 |
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
使用方法 数组名.函数名 |
3.2.2 ndarray的形状
3.2.3 ndarray的类型
1 |
|
3.3基本操作
adarray.方法()
np.函数名()
3.3.1生成数组的方法
生成0和1数组
1
2
3
4# np.zeros(shape)
# np.ones(shape)
zero = np.zeros(shape=(3,4), dtype ='int32')
ones = np.ones(shape=[3,4], dtype ='int32') #此时指定属性时,既可以是元组也可以是列表从现有数组生成
1
2
3
4
5
6
7
8#np.array()
#np.copy()
#np.asarray()
data1=np.array(score)
data2=np.copy(score)
#data1、data2深拷贝
data3=np.asarray(score)
#data3浅拷贝生成固定范围数组
1
2
3np.linspace(0,10,100) #[0,10] 等距离
np.arange(0,10,2) #[a,b) c是步长生成随机数组
分布状况—直方图
均匀分布
np.random模块
np.random.uniform(low = 0.0, high = 1.0, size = none) #功能:从一个均匀分布中[low,high)中随机采样,左闭右开 #low:采样下界,float类型,默认值为0; #high:采样上界,float类型,默认值为1 #size:输出样本数目,为int或元组类型,例如。size=(m,n,k),则输出mnk个样本,缺省时输出1个值 #返回值:ndarray类型,其形状和参数size中描述一致
1
2
3
4
5
正态分布:是一种概率分布。具有两个参数μ和σ的连续型随机变量的分布。μ是服从正太分布的随机变量的均值,σ是此随机变量的标准差,记为N(μ,σ)
```python
np.random.normal(loc=1.75,scale=0.1,size=10000)
3.3.2数组的索引、切片
1 |
|
3.3.3形状修改
ndarray.reshape()
ndarray.resize()
ndarray.T()
1 |
|
3.3.4类型改变
ndarray.astype(type)
ndarray序列化到本地
1 |
|
3.3.5数组的去重
ndarray.unique
1 |
|
##3.4ndarray运算
3.4.1逻辑运算
运算符 布尔索引
1 |
|
通用判断函数
np.all(布尔值)
只要有一个False就返回False,只有全是True才返回True
np.any(布尔值)
只要有一个True就返回True,只有全是False才返回False
1 |
|
三元运算符
np.where()
1 |
|
3.4.2统计运算
统计指标函数
主要函数:min max mean median(中位数) var(方差) std(标准差)
使用方法:np.函数名(数组名) 或 数组名.方法名
同时应当注意 axis的使用。 axis=0表示列 axis=1表示行 axis=-1 表示最后一维度
1
2
3
4
5
6
7
8###返回值
stock_change.max() #将返回最大值
np.max(stock_change,axis=1)#将返回一个向量,即所有行的最大值
###返回索引
np.argmax(tem,axis=0)
np.argmin(tem,axis=0)
返回最大值、最小值所在位置
3.4.3数组运算
数组与数的运算
正常的运算即可 加减乘除等
1 |
|
数组与数组的运算
广播机制
执行broadcast的前提在于,两个nadarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。
当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。
- 纬度相等
- shape(其中相对应的一个地方为1)
3.4.4矩阵运算
matrix,和array的区别是矩阵必须是二维的,但是array可以是多维的
矩阵&二维数组(不满足广播机制不能进行计算)
两种方法存储矩阵
1)ndarray 二维数组
2)matrix数据结构
1 |
|
矩阵乘法运算
形状改变
(mn) * (nm)
运算规则
矩阵的乘法必须满足运算规则,即(m,n)*(n,l)=(m,l)
1
2
3
4
5
6
7#如果是二维数组实现矩阵运算
np.dot(data,data1)
np.matmul(data,data1)
data @ data1
#如果是矩阵进行运算
data1*data23.5
3.5 合并与分隔
3.5.1合并
numpy.hstack 水平拼接
numpy.vstack 竖拼接
numpy.concatenate((a1,a2),axis=0|1) 水平|竖拼接
1
2
3
4
5data1 = np.mat([1,2,3])
data2 = np.mat([4,5,6])
np.vstack((data1,data2))
np.hstack((data1,data2))
np.concatenate((data1,data2),axis=1)
3.5.2 分隔
3.6 IO操作与数据处理
data = np.genfromtxt(“text.csv”, delimeter = “,”)
3.6.1numpy读取
3.6.2 如何处理缺失值
- 直接删除含有缺失值的样本
- 替补/插补;
4 Pandas
4.1Pandas介绍
- Pandas=panel+data+analysis
专门用于数据挖掘的开源Python库
以Numpy为基础,借力Numpy模块在计算方面性能高的优势
基于matplotlib,能够简便的画图
独特的数据结构
便捷的数据处理能力
读取文件方便
封装了Matplotlib、Numpy的画图和计算
4.1.3 DataFrame
结构:既有行索引又有列索引的二维数组
索引:行索引-index,横向索引;列索引-columns,纵向索引
1
2
3
4
5
6
7pd.DataFrame(stock_change)
#添加行索引
stock = ["股票{}".format(i) for i in range(10)]
pd.DataFrame(stock_change, index = stock)
#添加列索引
date = pd.date_range(start="20100101",periods = 5, freq= "B")
pd.DataFrame(stock_change, index = stock, columns = date)值:values,利用values即可直接获得去除索引的数据(数组)
shape:表明形状 (形状不含索引的行列)
T:行列转置
1 |
|
DataeFrame索引的设置
修改行列索引值
不能单独修改所以,只能整体修改索引
1 |
|
- 重设索引
- 设置新索引
1 |
|
4.1.4 MultiIndex
分级或分层索引对象
- Index属性
- names: levels的名称
- levels:每个level的元组值
4.1.5 Panel
pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)
存储3维数组的Panel结构
- items - axis 0,每个项目对应于内部包含的数据帧(DataFrame)。
- major_axis - axis 1,它是每个数据帧(DataFrame)的索引(行)。
- minor_axis - axis 2,它是每个数据帧(DataFrame)的列。
4.1.6 Series
带索引的一维数组
1 |
|
4.2基本数据操作
4.2.1 索引操作
1 |
|
#### 4.2.1.1 直接索引
4.2.1.2 按名字索引
4.2.1.3 按数组索引
4.2.2 赋值操作
1 |
|
4.2.3排序
sort_values (比较values进行排序) sort_index (比较行索引进行排序,不行可以先转置简介对列排序)
内容排序
索引排序
1 |
|
4.3 DataFrame运算
4.3.1算术运算
1 |
|
4.3.2 逻辑运算
逻辑运算 :< ; > ; | ; & 利用逻辑符号或者函数query
1 |
|
利用布尔值索引,即利用一个布尔数组索引出True的数据
1 |
|
4.3.3 统计运算
1 |
|
累计统计函数(累加,累乘等)
- cumsum 计算前1/2/3/…/n个数的和
- cummax 计算前1/2/3/…/n个数的最大值
- cummin 计算前1/2/3/…/n个数的最小值
- cumprod 计算前1/2/3/…/n个数的积
自定义运算
apply(func, axis=0)
func: 自定义函数
axis=0: 默认按列运算,axis=1按行运算
1 |
|
4.4Pandas画图
pandas.DataFrame.plot
DataFrame.plot(x=None, y=None, kind=‘line’)
- x: label or position, default None
- y: label, position or list of label, positions, default None
- Allows plotting of one column versus another
- kind: str
- ‘line’: line plot(default)
- ‘bar”: vertical bar plot
- “barh”: horizontal bar plot
- “hist”: histogram
- “pie”: pie plot
- “scatter”: scatter plot
4.5 文件读取与存储
4.5.1 CSV文件
4.5.1.1 读取CSV文件 read_csv()
1 |
|
4.5.1.2 写入CSV文件 to_csv()
1 |
|
path_or_buf :string or file handle , default None
sep : character, default ‘,’(分隔符)
columns :sequence,optional
mode:’w‘:重写,’a’追加
index:是否写入 行索引
header:boolean or list of string,default True,是否写进列索引值
1
Series.to_csv (path=None,index=True,sep=',',na_rep='',float_format=None,header=False,index_label=None,mode='w',encoding=None,compression=None,date_format=None,decimal='.)
1 |
|
4.6Pandas高级处理
4.6.1 缺失值处理
如何进行缺失值处理?
- 删除含有缺失值的样本
- 替换/插补数据
判断NaN是否存在
- pd.isnull(df) 会返回整个dataframe的布尔框架,难以观察(bool为True代表那个位置是缺失值)
- pd.isnull(df).any() 表示只要有一个True就返回True
- pd.notnull(df)会返回整个dataframe的布尔框架,难以观察(bool为False代表那个位置是缺失值)
- pd.notnull(df).all() 表示只要有一个False就返回False
删除nan数据
- df.dropna(inplace=True) 默认按行删除 inplace:True修改原数据,False返回新数据,默认False
替换nan数据
- df.fillna(value,inplace=True)
- value替换的值
- inplace:True修改原数据,False返回新数据,默认False
1 |
|
替换非nan的标记数据
1 |
|
4.7 数据离散化
实现方法:
1.分组
- 自动分组 sr = pd.qcut(data,bins)
- 自定义分组 sr = pd.cut(data,[])
2.将分组好的结果转换成one-hot编码(哑变量)
- pd.get_dummies(sr, prefix=)
1 |
|
4.8 合并
指合并不同dataframe上的内容数据
按方向拼接
1
2pd.concat([data1, data2], axis=1)
#axis:0为列索引;1为行索引按索引拼接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left, right, how="inner", on=["key1", "key2"])
pd.merge(left, right, how="left", on=["key1", "key2"])
pd.merge(left, right, how="outer", on=["key1", "key2"])
###这里merge参数解释:
#left: 需要合并的一个表,合并后在左侧
#right:需要合并的一个表,合并后在右侧
#how: 合并方式
#on: 在哪些索引上进行合并4.9 交叉表与透视表
找到、探索两个变量之间的关系0