三层结构
容器层:canvas、figure、axes
画板层(canvas):用户接触不到
画布层(figure):
plt.figure(figsize=(),dpi=)
figsize:画布大小
dpi:清晰度
plt.savefig('文件名'):以文件名的形式保存
一个画布可以包含多个绘图区
绘图区(axes):plt.subplots()
辅助显示层:图例(legend)、网格(grid)、标题(title)、外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick),坐标轴刻度标签(tick label)
plt.xticks()
plt.yticks()
中文显示问题
安装字体、删除matplotlib缓存文件、配置文件
plt.grid(alpha=,linestyle='')
表示显示网格,alpha设置透明度
主要是用来帮助用户理解
图像层:图里面的内容、不同的图像类型
折线图plot:某事物、某指标随时间的变化
numpy.linepace(-10,10,1000):-10到10之间等距离生成1000个数
散点图scatter:关系/规律
柱状图bar:统计/对比
对比柱状图的x坐标需要不同,稍微平移
x轴标签的话也要根据实际情况调整一下
调整宽度
直方图hist:连续分布状况(年龄、价格)
直方图展示数据分布,柱状图比较数据大小
默认展示频数,需要展示频率的时候修改density=True即可
饼图pie:占比(超过9个类别就不要用饼图了)
格式化输出:autopct=%.2f%%(前面的%.2f表示保留两位小数,后面的%%表示取得%这个符号)
plt.axis(‘equal’)#正圆
总结
什么是matplotlib:2D画图的Python第三方库
为什么用matplotlib:方便自己查看及分析
matplotlib的三层结构**(容器层、辅助显示层、图像层)**
numpy
高效的运算工具
机器学习,深度学习各种框架的基础库
用于处理任意维度的数组
与Python原生list对比:
numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,numpy的优势就越明显。
numpy的优势
存储风格:
ndarray:相同类型-通用型很弱
list:不同类型-通用性很强
ndarray在存储数据时,数据与数据的地址都是连续的,这样就使得批量操作数组元素时速度更快。
这是因为ndarray总的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而Python原生list就只能通过寻址方式找到下一个元素。因此,虽然在通用性方面,ndarray不及Python原生list,但是在科学计算中,ndarray就可以省略掉很多循环语句,代码使用方面比Python原生list简单得多。
并行化运算:
支持并行化运算(向量化运算)
底层语言:
底层使用C语言编写,内部解除了GIL(全局解释器),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。
ndarray属性
ndarray.shape():几行几列
ndarray.ndim():维度
ndarray.size():元素个数
ndarray.dtype():整数默认’int64’
ndarray.itemsize():8字节
如果不指定数据类型,整数默认int64,浮点数默认float64
基本操作
ndarray.方法()
numpy.函数名(ndarray)
生成数组的方法:
(1)生成0和1:占位置
np.zeros/ones(shape)
里面shape的形式既可以是列表,也可以是元组
np.ones([2,3])、np.ones((2,3))
从现有数组中生成:
np.array(ndarray):深拷贝
np.copy(ndarray):深拷贝
np.asarray(ndarray):浅拷贝
生成固定范围的数组:
np.linspace(0,10,100):生成[0,10]之间的100个等距离的数
np.arange(0,100,10):生成[0,100)之间以10为步长的数
生成随机数组:
分布状况
均匀分布:
np.random.uniform(-1,1,1000),可能性相等
正态分布(第一个参数是服从正态分布的均值,指的是对称轴的位置;,第二个参数是随机变量的方差,决定曲线的高矮,成反比)
np.random.normal(均值,方差,形状)
修改形状:
np.reshape():返回新的ndarray,没有改动原数组
np.resize():修改原数组,没有返回值
ndarray.T:转置,行列互换
类型修改:
ndarray.astype(type)
ndarray序列化到本地:ndarray.tostring()
数组的去重:
ndarray.unique():去重,得到的结果为一维数组
ndarray.flatten():转换为一维数组
ndarray运算
逻辑运算:布尔索引
ndarray[条件]:条件例如ndarray
[ndarray>0.5]
通用判断:返回布尔值
np.all(条件):数组指定范围内全部元素满足才行
np.any(条件):指定范围内有一个元素满足条件即可
np.where(条件,条件成立的值,条件不成立的值)
#判断前四个股票前四天的涨跌幅,大于0.5并且小于1的,换为1,否则为0
np.where(np.logical_and(temp>0.5,temp<1),1,0)
#判断前四个股票前四天的涨跌幅,大于0.5或者小于-0.5的,换为1,否则为0
np.where(np.logical_or(temp>0.5,temp<-0.5),1,0)
np.min()
np.max()
np.median()
np.mean()
np.std()
np.var()
ndarray.方法()或者numpy.方法(ndarray)
np.argmax(ndarray)、np.argmin(ndarray):返回最值所在位置
参数里面加上axis表示对应的行列进行统计运算
axis=0代表列,axis=1代表行
数组运算:
数组与数的运算:
数组与数组的运算:
广播机制:
执行broadcast的前提在于,两个ndarray执行的是element-wise的运算,broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。
当操作两个数组时,numpy会逐个比较它们的shape(构成的元组),只有在下述情况下,两个数组才能够进行数组与数组间的运算:
维度相等、shape(其中相对应的一个地方为1)
矩阵运算:
什么是矩阵,矩阵具有高维度吗?
矩阵必须是二维的,但是array可以是高维的
矩阵&二维矩阵的区别:二维数组不一定是矩阵,矩阵一定是以二维数组的形式进行存储
两种方法存储矩阵:
ndarray 二维数组
matrix数据结构
矩阵乘法运算:
形状:(m,n)*(n,l)=(m,l)
合并、分割、IO操作
合并
numpy.hstack(tuple):水平
numpy.vstack(tuple):垂直
numpy.concatenate((a1,a2,...),axis=0):通过axis指定行或者列
分割
np.split(ndarray,n):将数组分为n份
np.split(ndarray,[index...]):根据索引将数组进行切片,沿着前面的继续往下切片
例子:
ndarray=np.arange(9)
np.split(ndarray,[3,5,6,10])
>>>
[array([0, 1, 2]),
array([3, 4]),
array([5]),
array([6, 7, 8]),
array([], dtype=int64)]
IO操作
data = np.genfromtxt(文件路径,分隔符)
出现缺失值怎么处理?
当我们读取本地文件为float的时候,如果有缺失(或者为None),就会出现nan
pandas处理缺失值会比较快速
pandas
是什么
专门用于数据挖掘的开源Python库
以numpy为基础,借力numpy模块在计算方面高性能的优势
基于matplotlib,能够简便的画图
独特的数据结构
为什么用
便捷的数据处理能力
读取文件方便
封装了matplotlib、numpy的画图和计算
核心数据结构
dataframe、panel、series
dataframe:具有行、列索引的二维数组
属性:shape、columns、index、value(获得除去行列索引的ndarray)、T(转置)
基本操作
data.head()/tail()前面或后面几行
pd.dates_range(start,end,period,freq)
修改行列索引
不能单独修改某个索引
重设索引
reset_index():获得默认行索引,默认不去掉原来的行索引
设置新索引
set_index(keys,drop)
keys:列索引名或列索引名称的列表
drop:默认删除原来的列
multiindex与panel
names:.index.names
level:.index.level
panel:三维数组
pd.Panel(np.arange(24).reshape(2,3,4))
改用multiindex
data.iloc[1,:]:第二行全部数据
Series:带索引的一维数组
dataframe是series的容器
panel是dataframe的容器
基本数据操作
读取:pd.read_csv(路径)
索引
直接索引
不能直接进行数字索引,要先列后行,用标签索引
名字索引
data.loc[][]/[,]
也可以
数字索引
data.iloc[1,0]/[1][0]
组合索引
data.ix[:4,['open','close']]
赋值
data[‘open’]=a 整列赋值
索引找到进行赋值即可
排序
对内容排序
data.sort_values(by=[a,b],ascending=)
单个键或者多个键进行排序,默认升序;ascending=False表示降序
先按照a进行排序,出现相同的就按照b进行排序
运算
算术运算、逻辑运算、自定义运算
画图
文件的读取与存储