NumPy、Matplotlib、Pandas
一、引言
1. NumPy(Numerical Python)1: N维数组对象ndarray, 矩阵运算, 数学函数库
2. Matplotlib(matrix plot library): 线图、散点图、条形图、柱状图
3. Pandas: 从CSV、JSON、SQL、Excel等文件格式导入数据进行数据清洗、加工和分析
4. SciPy(Scientific Python): 最优化、线性代数、积分、插值、快速傅里叶变换、信号处理和图像处理、常微分方程求解
5. Seaborn: 可视化库,对matplotlib进行二次封装,将多个图封装成一个接口,即绘图接口更为集成,可通过少量参数设置实现大量封装绘图。
二、NumPy
- numpy类、子模块、函数:
类
dtype/complex64/ndarray/char(字符串包)/linalg(det/solve/inv线性代数包)
方法
arange/array/empty/ones/zeros/linspace/logspace(返回ndarray类的对象/实例),nditer,transpose,expend_dims/squeeze(维度),concatenate/stack(连接),split,resize/append/insert/delet/unique(增删),arctan,around,substract/divide/multiply/power/mod(计算),amin/median/mean/average/std/var(统计),sort/argsort/argmax/nonzero/where(排序、筛选),view/copy,dot/vdot/inner/matmul(线性代数),meshgrid(生成坐标矩阵) - ndarray对象/实例,如array([1, 2])是用于存放同类型元素的多维数组:
属性
ndim,shape,size,dtype,itemsize,real,image
方法
astypere,flatten,ravel(形状),T, - 索引:二维a[…,1:],a[[0,2],[1,2]],a[0:,[1,2]],a[a>5],a[~np.isnan(a)],a[[1,0,2]]
三、Matplotlib
- 绘图接口:figure/axes(面向对象:画板和子图),pyplot(面向当前图:绘制图表),
- 绘图步骤:
(1)创建画板:figure/axes/subplot/sublopts实现不同区域画图
(2)绘制图表:plot(折线图或点图)/scatter/bar/barh(水平条形图)/hist(离散标签下的数量对比)/pie/imshow(根据像素点数据完成绘图并显示)
color(r,y,b),linestyle(-/--/:),marker样式(./o/>/1/*)
(3)配置图例:title,axis/xlim/ylim(坐标轴范围),grid(网格线),legend(图例),xlable/ylable(坐标轴标题)loc
,xticks/yticks(指定坐标轴刻度),text/arrow/annotation
(4)中文、保存图片:plt.matplotlib.rcParams[‘font.family’]=‘STSong’/plt.matplotlib.rcParams[‘font.size’]=20/plt.rcParams[‘axes.unicode_minus’]=False#用来正常显示负号,savefig(在show前面) - 普通画图实例2,三维平面与曲面
'''一:一幅图画两条曲线'''
#(15到20摄氏度之间的)和(5到10摄氏度之间的)温度在11:00~12:00的两条变化曲线
import matplotlib.pyplot as plt
import random
plt.matplotlib.rcParams['font.family']='STSong'#显示中文及字号
plt.matplotlib.rcParams['font.size']=20
x = range(60)#数据
y = [random.uniform(15,20)for i in x]
y_another = [random.uniform(5,10)for i in x]
plt.figure( figsize=(12,8), dpi=80 )#画布
plt.plot(x,y,label='温度曲线1')#画带图例的图
plt.plot(x,y_another,color='g',linestyle='-.',label='温度曲线2')
z = range(40)#设置刻度及步长
x_label = ['11:{}'.format(i) for i in x]
plt.xticks( x[::5], x_label[::5])
plt.yticks(z[::5])
plt.grid(True, linestyle='--', alpha=0.5)#添加网格信息
plt.legend(loc='right')#显示图例
plt.xlabel('时间')#横纵标题
plt.ylabel('温度')
plt.title('温度随时间变化曲线')#图标题
plt.legend()#显示图例,默认loc=Best
plt.savefig('./test.png')#保存图片
plt.show()#展示
'''二、可以通过figure、subplot、subplots实现多个绘图区域画不同的曲线图,见上面创建画板处的链接,下面以subplots为例:'''
figure,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,8), dpi=80)
axes[0].plot(x,y,label='温度曲线1')#画带图例的图
axes[1].plot(x,y_another,color='g',linestyle='-.',label='温度曲线2')
axes[0].set_title("曲线1")#设置图标题
axes[1].set_title("曲线2")
for ax in axes:
ax.legend()#显示图例,默认loc=Best
ax.set_yticks(z[::5])#设置步长
plt.show()
'''三、散点图、柱状图、直方图、饼图'''
x = range(8)
y = [100,200,400,350,450,350,250,300]
z = [200,300,350,250,450,450,500,250]
plt.scatter(x,y,color='b',marker='>',linewidths=5,label='散点图')
plt.bar(x,y,width=0.4,color=['r','k','y','g','b','c','m','k'],label='柱状图')
plt.bar( [i+0.2 for i in x], z, width=0.2, color='r', label='与上面一起形成双柱状图' )
plt.hist(x=np.random.randint(50,200,[80]),bins=int((max(number)-min(number))//10),color='b',label='直方图',width=5)
#每区间为10的区域内出现了多少次;y轴可以是频数,也可以是频率
plt.pie(x=y, labels=['class1','class2','class3','calss4','class5','class6','class7','calss8'],
color=['r','k','y','g','b','c','m','k'],label='饼图', explode=[0.2, 0., 0., 0., 0., 0., 0., 0.],autopct='%1.2f%%')
#explode突出显示,值越大,距离中心越远;autopct各个扇形百分比显示
四、Pandas
- 数据结构
(1)Series:类似表格中的一个列。一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
(2)DataFrame 是一个表格型的数据结构。由 Series组成的字典(行索引和列索引)。 - pandas.Series(data,index)#index缺省时,行索引标签默认0~n
(1) seri=pandas.Series(data=[“Google”,“Runoob”,“Wiki”],index=[“x”,“y”,“z”])
(2) seri=pandas.Series({“x”:“Google”,“y”:“Runoob”,“z”:“Wiki”})
(3) 返回指定某行数据:seri[“x”] - pandas.DataFrame(data,index,columns)#index缺省时,行索引标签默认0~n
(1) data=pandas.DataFrame(data=[[‘Google’,10],[‘Runoob’,12],[‘Wiki’,13]],index=[“a”,“b”,“c”],columns=[‘Site’,‘Age’])
(2) data=pandas.DataFrame({‘sites’:[“Google”,“Runoob”,“Wiki”],‘number’:[1,2,3]})
(3) data=pandas.DataFrame([{‘a’:1,‘b’:2},{‘a’:5,‘b’:10,‘c’:20}])#没有对应的部分数据为NaN
(4) 返回指定列数据:data[“a”]
(5) 返回指定行数据:data.loc[0] - CSV文件:以纯文本形式存储表格数据。read_csv/to_csv/head/tail/info
- JSON(JavaScript Object Notation):存储和交换文本信息的语法,JavaScript对象表示法,[]保存数组,数组可以包含多个对象,对象用{}保存。read_json/(解析内嵌数据)先json.load(open(path))再json_normalize
import pandas as pd
import numpy as np
# 5x2的DataFrame数据,index表示行的编号,columns表示列的编号print(df)
data = pd.DataFrame(np.random.randn(5, 2), index=range(0, 5, 1), columns=list('AB'))
# loc表示通过标签取数据,标签就是上面的‘0’-‘4’和‘A’-‘B’,若未设置标签索引,则默认为位置索引,即=iloc。
print(data .loc[0])
print(data .loc[0, :])
print(data .loc[0:2, 'A'])
print(data.loc[0]['A'])获取元素,行在前,列在后
# iloc表示通过位置取数据,即第m行,第n列数据,只接受整型参数。记住:0:2为“包左不包右”,即取0, 1。
print(data .iloc[0, :])
print(data .iloc[:, 0])
print(data .iloc[0:2, :])
print(data.loc[0][0])获取元素,行在前,列在后
# DataFrame可以直接使用数组方式索引,从而代替loc,但只能索引列,不能索引某行或某几行。
print(data['A'])
print(data['A'][2]) #根据列索引+行索引获取元素,注意列在前,行在后