一、机器学习基本使用工具
常用的工具有如下几个
工具 | 作用 |
---|---|
matplotlib | 画图工具 |
numpy | 表格处理工具 |
padas | 信息处理工具 |
二、Matplotlib工具
2.1 matplotlib安装
打开cmd,输入以下代码
pip install matplotlib
安装完成后,再次输入以下代码检查是否安装成功
pip list
2.2 导入库
import matplotlib.pyplot as plt
2.3 创建画布
注意:后面的matplotlib.pyplot均代指画布名称
plt.figure(figsize = (a,b),dpi = )
figsize:指图像的长(a)宽(b) dpi:图像清晰度(越大越清晰)
2.4 绘制图像
plt.plot(x,y.color = '',linestyle = '',marker = '',linestyle='',label='')
x:横轴数据 y:纵轴数据 color:图像颜色,可以直接输入英文名称,或者是RGB颜色值(下面附有图) linewidth:线条宽度 marker: 标记风格 linestyle: 线条样式 label:图例
2.4.1 常用color
颜色 | 说明 | 颜色 | 说明 |
---|---|---|---|
r | 红色 | g | 绿色 |
b | 蓝色 | w | 白色 |
c | 青色 | m | 洋红 |
y | 黄色 | k | 黑色 |
2.4.2 标记风格
标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|
'.' | 点标记 | ',' | 像素标记(极小点) |
'v' | 倒三角标记 | ’^‘ | 上三角标记 |
'>' | 右三角标记 | '<' | 左三角标记 |
'1' | 下花三角标记 | '2' | 上花三角标记 |
'3' | 左花三角标记 | '4' | 右花三角标记 |
'o' | 实心圈标记 | 's' | 实心方形标记 |
'p' | 实心五角标记 | '*' | 星形标记 |
'h' | 竖六边形标记 | 'H' | 横六边形标记 |
'+' | 十字标记 | 'x' | x标记 |
'D' | 菱形标记 | 'd' | 瘦菱形标记 |
2.4.3 线条样式
样式 | 说明 |
---|---|
’-‘ | 实线 |
’--‘ | 虚线 |
’-.‘ | 点划线 |
':' | 点虚线 |
2.5 添加自定义x,y刻度
plt.xticks(x,rotation=,fontsize=) plt.yticks(y,rotation=,fontsize=)
x:要显示的刻度值 y:要显示的刻度值 rotation:旋转角度 fontsize:字体大小 注意:在传递进去的第一个参数必须是数字,不能是字符串,如果是字符串需要进行替换操作
2.6 设置x,y标签和标题
plt.xlabel(,fontsize=) plt.ylabel(,fontsize=) plt.title(,fontsize=)
2.7 添加网格显示
plt.grid(True,linestyle=,alpha=)
alpha:代表透明度
2.8 设置图例位置
plt.legend(loc=)
loc:图例所在位置
loc位置表
位置 | 描述 | 对应数字 |
---|---|---|
best | 最佳位置 | 0 |
upper right | 右上方 | 1 |
upper left | 左上方 | 2 |
lower left | 左下方 | 3 |
lower right | 右下方 | 4 |
right | 右边 | 5 |
center left | 中间左边 | 6 |
center right | 中间右边 | 7 |
lower center | 下方中间 | 8 |
upper center | 上方中间 | 9 |
center | 正中心 | 10 |
2.9 设置画板多图
matplotlib.pyplot.add_subplot(nrows,ncols,**fig_kw)
nrows:第几行 ncols:第几列 **fig_kw:代表第几个图
2.10 图像保存
plt.savefig(path_or_buffer)
path_or_buffer:文件地址 注意:图像保存需要放在显示图像的前面,因为plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片
2.11 显示图像
plt.show()
2.12 中文显示问题
在图像中设置刻度标签中有汉字,但汉字显示不出来的情况(通常显示为[]) 这是因为没有装'SimHei'字体 解决办法: 在导入库后填上如下代码
plt.rcParams['font.sans-serif'] = ['SimHei']
2.13 基本统计图
2.13.1 折线图
在不设置需要画统计图的类型之前,默认画的是折线图
下面通过一个例子来辅助理解
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>x = [5,10,15,20,25] >>>y = [3,7,4,5,3] >>>plt.plot(x,y) >>>plt.savefig(r"D:\data\python\exercise\test1\1.png") >>>plt.show()
2.13.2 散点图
plt.scatter(x,y)
下面通过一个例子来辅助理解
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>x = [5,10,15,20,25,7,4,2,4,12,23,14,19,22,19,18,20,16] >>>y = [3,7,4,5,3,3,2.3,2.4,4.5,4.8,2.1,3,4.5,5.6,6.5,5.8,6.2,3.9] >>>plt.scatter(x,y) >>>plt.savefig(r"D:\data\python\exercise\test1\2.png") >>>plt.show()
2.13.3 柱状图
plt.bar(x,width=,height=,label=,alpha=,align=,color=)
x: 柱状图中的横坐标点list height: 柱状图对应每个横坐标的高度值 width: 柱状图的宽度,默认值为0.8 label: 每个数据样本对应的label,后面调用legend()函数可以显示图例 alpha: 透明度 align:每个柱状图的对齐方法 color:选择柱状图的颜色
下面通过一个例子来辅助理解
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>x = [5,10,15,20,25,7,4,2,4,12,23,14,19,22,19,18,20,16] >>>y = [3,7,4,5,3,3,2.3,2.4,4.5,4.8,2.1,3,4.5,5.6,6.5,5.8,6.2,3.9] >>>plt.bar(x,y) >>>plt.savefig(r"D:\data\python\exercise\test1\3.png") >>>plt.show()
2.13.4 直方图
plt.hist(x,bins=None)
x:需要传递的数据 bins:组距
下面通过一个例子来辅助理解
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>x = [5,10,15,20,25,7,4,2,4,12,23,14,19,22,19,18,20,16] >>>y = [3,7,4,5,3,3,2.3,2.4,4.5,4.8,2.1,3,4.5,5.6,6.5,5.8,6.2,3.9] >>>plt.hist(x,bins=25) >>>plt.savefig(r"D:\data\python\exercise\test1\4.png") >>>plt.show()
2.13.5 饼图
plt.pie(x,explode=None,labels=None,autopct=None,pctdistance=0.6,shadow=False, labeldistance=1.1,startangle=None,radius=None,counterclock=True,wedgeprops=None, textprops=None,center=(0,0),frame=False,rotatelabels=False,*,data=None)
x:表示扇形或锲形的数据 explode:表示扇形或锲形离开圆心的距离 labels:表示扇形或锲形对应的标签文本 autopct:表示控制扇形或锲形的数值显示的字符串,可通过格式字符串指定小数点后的位数. pctdistance:表示扇形或锲形对应的数值标签距离圆心的比例,默认为0.6 shadow:表示是否显示阴影 labeldistance:表示标签文本的绘制位置(相对于半径的比例),默认为1.1. startangle:表示起始绘制角度,默认从x轴的正方向逆时针绘制 radius:表示扇形或锲形的半径. wedgeprops:表示控制扇形或锲形属性的字典.例如:通过wedgeprops={’‘width’:0.7}将锲形的宽度设为0.7. textprops:表示控制图表中文本属性的字典 center:表示图表中心点位置,默认为(0,0) frame:表示是否显示图框
下面通过一个例子来辅助理解
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示问题 >>>huaban = plt.figure(figsize=(10, 10), dpi=100) >>>x = [np.random.rand(1), np.random.rand(1), np.random.rand(1)] #定义三个随机数 >>>num = x[0]+x[1]+x[2] >>>plt.title('2000年第一季度国民生产总值产业构成分析饼图', fontsize=10) >>>color = ["#F0FFFF", "#FF9912", "#00FF00"] #这里是RGB颜色的编码 >>>name = ['第一产业', '第二产业', '第三产业'] >>>size = [x[0]/num*100, x[1]/num*100, x[2]/num*100] >>>plt.pie(size, labels=name, colors=color, autopct='%1.2f%%') >>>plt.savefig(r"D:\data\python\exercise\test1\5.png") >>>plt.show()
2.14 绘制简单的数学图像
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>x = np.linspace(-2*np.pi, 2*np.pi, 100000) >>>y = np.sin(x) >>>plt.plot(x,y) >>>plt.savefig(r"D:\data\python\exercise\test1\6.png") >>>plt.show()
2.15 绘制较复杂的图像
通过随机值画出2000年至2017年三种产业的生产总值变化折线图和2000年至2017年的第一季度各产业生产总值变化图。(注意:在一个画板中画出。产业=['农业', '工业', '建筑', '批发', '交通', '餐饮', '金融', '房地产', '其他'])
下面附上过程辅助理解
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示问题
>>>huaban = plt.figure(figsize=(10, 5), dpi=200)
>>>p1 = huaban.add_subplot(211) #设置两个子图,排列方式为两行一列
>>>plt.ylim(0, 100000) #设置y坐标的范围
>>>x1 = np.linspace(0, 70, 35) #设置三组x,y
>>>y1 = np.random.randint(0, 100000, 35) #使用np.random.randint(初始值,结束值,个数)输出随机数
>>>x2 = np.linspace(0, 70, 35)
>>>y2 = np.random.randint(0, 100000, 35)
>>>x3 = np.linspace(0, 70, 35)
>>>y3 = np.random.randint(0, 100000, 35)
>>>plt.title('2000-2017年各产业季度生产总值折线图', fontsize=6)
>>>plt.ylabel("生产总值(亿元)", fontsize=6)
>>>L1, = p1.plot(x1, y1, color='blue', ls=':', lw=1)
>>>L2, = p1.plot(x2, y2, color='red', ls='--', lw=1)
>>>L3, = p1.plot(x3, y3, color='green', ls='-.', lw=1)
>>>plt.legend(handles=[L1, L2, L3], labels=['第一产业', '第二产业', '第三产业'], loc='upper left', fontsize=4) #handles 表示所要处理的线,参数为列表
>>>p2 = huaban.add_subplot(212) #子图2的编写
>>>plt.ylim(0, 70000)
>>>x4 = np.linspace(0, 17, 35) #设置9组x,y(y为随机数)
>>>y4 = np.random.randint(0, 70000, 35) #使用np.random.randint(初始值,结束值,个数)输出随机数
>>>x5 = np.linspace(0, 17, 35) #np.random.rand(个数)一般输出的随机数一般范围在-1.96~1.96之间
>>>y5 = np.random.randint(0, 70000, 35)
>>>x6 = np.linspace(0, 17, 35)
>>>y6 = np.random.randint(0, 70000, 35)
>>>x7 = np.linspace(0, 17, 35)
>>>y7 = np.random.randint(0, 70000, 35)
>>>x8 = np.linspace(0, 17, 35)
>>>y8 = np.random.randint(0, 70000, 35)
>>>x9 = np.linspace(0, 17, 35)
>>>y9 = np.random.randint(0, 70000, 35)
>>>x10 = np.linspace(0, 17, 35)
>>>y10 = np.random.randint(0, 70000, 35)
>>>x11 = np.linspace(0, 17, 35)
>>>y11 = np.random.randint(0, 70000, 35)
>>>x12 = np.linspace(0, 17, 35)
>>>y12 = np.random.randint(0, 70000, 35)
>>>plt.ylabel("生产总值(亿元)", fontsize=6)
>>>_xtick_labels = ["200{}年第一季度".format(i) for i in range(10)] #设置x轴下标
>>>_xtick_labels += ["201{}年第一季度".format(i) for i in range(8)]
>>>plt.xticks(list(x4)[::2], _xtick_labels[::1], rotation=45, fontsize=6) #fontsize表示字体大小,rotation表示旋转角度
>>>plt.yticks(np.linspace(0, 70000, 8))
>>>D1, = p2.plot(x4, y4, color='blue', lw=1, label='农业') #定义9条线[D1, D2, D3, D4, D5, D6, D7, D8, D9]
>>>D2, = p2.plot(x5, y5, color='yellow', ls=':', lw=1, label='工业')
>>>D3, = p2.plot(x6, y6, color='red', ls='--', lw=1, label='建筑')
>>>D4, = p2.plot(x7, y7, color='green', ls='-.', lw=1, label='批发')
>>>D5, = p2.plot(x8, y8, color='grey', lw=1, label='交通')
>>>D6, = p2.plot(x9, y9, color='brown', ls=':', lw=1, label='餐饮')
>>>D7, = p2.plot(x10, y10, color='cyan', ls='--', lw=1, label='金融')
>>>D8, = p2.plot(x11, y11, color='black', ls='-.', lw=1, label='房地产')
>>>D9, = p2.plot(x12, y12, color='magenta', lw=1, label='其他')
>>>plt.legend(handles=[D1, D2, D3, D4, D5, D6, D7, D8, D9]) #handles 表示所要处理的线,参数为列表
>>>plt.legend(labels=['农业', '工业', '建筑', '批发', '交通', '餐饮', '金融', '房地产', '其他'], >>>loc='center right', fontsize=4)
>>>plt.savefig(r"D:\data\python\exercise\test1\7.png")
>>>plt.show()
三、Numpy工具
3.1 numpy安装
打开cmd,输入以下代码
pip install numpy
安装完成后,再次输入以下代码检查是否安装成功
pip list
3.2 导入库
import numpy as np
3.3 创建ndarray
注意:后面的ndarray均代指对象名称
data = np.array()
3.4 基本方法
名称 | 作用 |
---|---|
data.shape | 查看数组的维度(以元组的形式输出) |
data.ndim | 查看数组维数 |
data.size | 查看数组中的元素数量 |
data.itemsize | 查看一个数组元素的长度 |
data.dtype | 查看数组元素的类型 |
3.5 创建数组时指定类型
>>>data = np.array([[1,2,3],[4,5,6]],dtype=np.float32) >array([[1., 2., 3.], [4., 5., 6.]], dtype=float32)
名称 | 描述 | 简写 |
---|---|---|
np.bool | 用一个字节存储的布尔类型(Ture或False) | 'b' |
np.int8 | 一个字节大小,-128至127 | 'i' |
np.int16 | 整数,-32768至32767 | 'i2' |
np.int32 | 整数,-2^31^至2^31^-1 | 'i4' |
np.int64 | 整数,-2^63^至2^63^-1 | 'i8' |
np.uint8 | 无符号整数,0至255 | 'u' |
np.uint16 | 无符号整数,0至65535 | 'u2' |
np.uint32 | 无符号整数,0至2^32^-1 | 'u4' |
np.uint64 | 无符号整数,0至2^64^-1 | 'u8' |
np.float16 | 半精度浮点数,16位,正负号1位,指数5倍,精度10位 | 'f2' |
np.float32 | 半精度浮点数,32位,正负号1位,指数8倍,精度23位 | 'f4' |
np.float64 | 半精度浮点数,64位,正负号1位,指数11倍,精度52位 | 'f8' |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | 'c8' |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | 'c16' |
np.object_ | python对象 | 'o' |
np.string_ | 字符串 | 's' |
np.unicode_ | unicode类型 | 'U' |
3.6 生成只含0和1的数组
one = np.ones([index, columns]) #生成index行,columns列且所有元素都为1的数组 zero = np.zeros([index, columns]) #生成index行,columns列且所有元素都为0的数组 ones = np.ones_like(ndarray) #生成一个行数和列数都与ndarry相同的且所有元素均为1的数组 zeros = np.zeros_like(ndarray) #生成一个行数和列数都与ndarry相同的且所有元素均为0的数组
例如:
>>>one = np.ones([4,8]) >array([[1.,1.,1.,1.,1.,1.,1.,1.], [1.,1.,1.,1.,1.,1.,1.,1.], [1.,1.,1.,1.,1.,1.,1.,1.], [1.,1.,1.,1.,1.,1.,1.,1.]]) >>>zero = np.zeros_like(one) >array([[0.,0.,0.,0.,0.,0.,0.,0.], [0.,0.,0.,0.,0.,0.,0.,0.], [0.,0.,0.,0.,0.,0.,0.,0.], [0.,0.,0.,0.,0.,0.,0.,0.]])
注意:输出的每个元素都是浮点类型,是因为没有设置输出类型,默认为浮点类型,若是设置输出类型为整型,输出的每个元素都是整型
>>>one = np.ones([4,8],dtype='i') >array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]], dtype=int32)
3.7 从现有数组中生成
data1 = np.array(data) data2 = np.asarray(data)
np.array和np.asarray的区别
通过一个实例来解释
>>>a = np.array([[1,2,3],[4,5,6]]) >array([[1, 2, 3], [4, 5, 6]]) >>>a1 = np.array(a) >>>a2 = np.asarray(a) >>>a[0][0] = 100 >a1:array([[1,2,3], [4,5,6]]) a2:array([[100,2,3], [4,5,6]])
类似于深拷贝与浅拷贝,可以看到数组a1使用array进行复制,将a的原始数据拷贝过来,对于数组a中的元素改变,对数组a1的元素没有影响,数组a2使用asarray进行复制,对于数组a中的元素改变,数组a2的元素也跟着数组a中的元素改变而改变。
3.8 生成固定范围内的数组
3.8.1 np.linspace
np.linspace(start, stop, num, endpoint)
创建等差数组,指定数量(步长自动计算) start:序列的起始值 stop:序列的结束值 num:要生成的等间隔样例数量,默认为50 endpoint:序列中是否包含stop值,默认为true
3.8.2 np.arange
np.arange(start,stop,step,dtype)
创建等差数组,指定步长(数量自动计算) step:步长,默认为1
3.8.3 np.logspace
np.logspace(start,stop,num)
创建等比数组,生成以10的N次幂的数据 num:要生成的等比数组数量,默认为50
3.9生成随机数组
3.9.1 np.random模块
导入库
import random
3.9.2 正态分布
第一种:np.random.randn
np.random.randn(d0,d1,d2,……,dn)
功能:从标准正态分布中返回一个或多个样本值
第二种:np.random.normal
np.random.normal(loc = 0.0,scale = 1.0,size = None)
loc:float 此概率分布的均值(对应整个分布的中心) scale:float 此概率分布的标准差(对应于分布的宽度,scale值越大越矮胖,scale值越小越瘦高) size:int or tuple of ints 输出的shape,默认为None,只输出一个值
第三种:np.random.standard_normal
np.random.standard_normal(size = None)
返回指定形状的标准正态分布的数组
3.9.3 均匀分布
第一种:np.random.rand
np.random.rand(d0,d1,d2,……,dn)
返回[0.0,1.0)内的一组均匀分布的数
第二种:np.random.uniform
np.random.uniform(low = 0.0,high = 1.0,size = None)
从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high low:采样下界,float类型,默认值为0 high:采样上界,float类型,默认值为1 size:输出样本数目,为int或tuple类型,缺少时输出1个值。例如:size=(m,n,k)则输出mnk个样本 返回值:ndarray类型,其形状和参数与size中定义的一致
第三种:np.random.randint
np.random.randint(low, high = None,size = None,dtype = 'i')
从一个均匀分布中随机采样,生成一个整数或N维整数数组 取数范围:若high不为None时,取(low,high)之间的随机整数,否则取值[0,low)之间随机整数
3.10 数组索引,切片
通过索引将数组进行切片,其切片方式与列表相似
data[a:b,c:d]
注意:这里的数组切片遵循的规律是先行后列
3.11 形状修改
3.11.1 ndarray.reshape
ndarray.reshape(shape, order)
产生一个新的对象 返回一个具有相同数据域,但shape(维度)不一样的视图 行列不进行互换 可以使用data.reshape([-1,x])进行排序,但x必须被整除,否则会报错
下面用一个例子来帮助理解
>>>data = np.array([[1,2,3],[4,5,6]]) >array([[1, 2, 3], [4, 5, 6]]) >>>data1 = data.reshape(3,2) >array([[1, 2], [3, 4], [5, 6]]) >>>data2 = data.reshape(-1,6) >array([[1, 2, 3, 4, 5, 6]]) >>>data3 = data.reshape(-1,5) #这样会报错 >ValueError:cannot reshape array of size 6 into shape (5)
3.11.2 ndarray.resize
ndarray.resize(new_shape)
修改数组本身的形状(需要保持元素个数前后相同) 行列不进行互换
看上去和ndarray.reshape没什么不一样的,这两个方法作用相似但用法不同 下面用一个例子来帮助区别和理解
>>>data = np.array([[1,2,3],[4,5,6]]) >array([[1, 2, 3], [4, 5, 6]]) >>>data1 = data.reshape(3,2) >data1:array([[1, 2], [3, 4], [5, 6]]) data:array([[1, 2, 3], [4, 5, 6]]) >>>data2 = data.resize([3,2]) >data2:null data:array([[1, 2], [3, 4], [5, 6]])
resize是对于自身数组进行改变,对于新的数组不做任何变化 reshape是产生一个新的对象对自身不做变化
3.11.3 ndarray.T
对数组进行转置,将数组的行列进行互换
>>>data = np.array([[1,2,3],[4,5,6]]) >array([[1, 2, 3], [4, 5, 6]]) >>>data1 = data.T >array([[1, 3, 5], [2, 4, 6]])
3.12 类型修改
3.12.1 ndarray.astype
ndarray.astype(type)
返回修改类型之后的数组
3.12.2 ndarray.tostring和ndarray.tobytes
ndarray.tostring([order]) ndarray.tobytes([order])
构造包含数组中原始数据字节的python字节
3.13 数组的去重
np.unique()
下面用一个例子来帮助理解
>>>data = np.array([[1,2,2],[4,5,6]]) >>>data1 = np.unique(data) >array([1, 2, 4, 5, 6])
3.14 ndarray运算
3.14.1 逻辑运算
3.14.1.1 np.logical_and
np.logical_and(condition1,condition2)
condition:条件 当两个条件同时满足时返回Ture
np.logical_or
np.logical_or(condition1,condition2)
当其中一个条件满足时返回Ture
3.14.1.2 np.all
np.all()
所有条件都满足要求返回True,有任一个不满足返回False
3.14.1.3 np.any
np.any()
任一个条件满足要求返回True
3.14.1.4 np.where(三元运算符)
满足条件返回前一块内容,不满足返回后一块内容
np.where(condition,1,0)
满足条件返回1,不满足返回0 注意:复合逻辑需要结合np.logical_and和np.logical_or使用
3.15 布尔赋值
直接通过一个例子来辅助理解
>>>score = np.random.randint(40,100,(10,5))
>array([[75, 89, 86, 41, 96],
[72, 41, 69, 55, 94],
[45, 52, 96, 56, 84],
[63, 54, 62, 99, 46],
[97, 69, 54, 54, 58],
[63, 89, 88, 71, 77],
[42, 51, 71, 67, 83],
[82, 99, 52, 42, 59],
[54, 97, 83, 98, 89],
[41, 96, 46, 99, 77]])
>>>test_score = score[1:3,3:5]
>array([[55, 94],
[56, 84]])
>>>test_score > 60
>array([[False, True],
[False, True]])
>>>test_score[test_score > 60] = 1
>array([[55, 1],
[56, 1]])
3.16 统计指标
方法 | 作用 |
---|---|
np.min(ndarray,axis) | 查询所有行或所有列的最小值 |
np.max(ndarray,axis) | 查询所有行或所有列的最大值 |
np.median(ndarray,axis) | 查询所有行或所有列的中位数 |
np.mean(ndarray,axis) | 查询所有行或所有列的平均值 |
np.std(ndarray,axis,dtype) | 查询所有行或所有列的标准差 |
np.var(ndarray,axis,dtype) | 查询所有行或所有列的方差 |
np.ardmax(ndarray) | 查询最大值的位置 |
np.ardmin(ndarray) | 查询最小值的位置 |
注意:axis轴的取值并不一定,Numpy中不同的API轴的值都不一样
3.17 数组间的运算
3.17.1 数组与数
ndarray +1:数组里每个元素 +1 ndarray /2:数组里每个元素 /2 ndarray *2:数组里每个元素 *2
下面用一个例子来帮助理解
>>>data = np.array([[1,2,3],[4,5,6]]) >>>data + 1 >array([[2, 3, 4], [5, 6, 7]]) >>>data * 2 >array([[ 2, 4, 6], [ 8, 10, 12]])
注意:python列表运算,是将整个列表复制,不是将每个元素的值运算
>>>a = [1,2,3] >>>a * 3 >[1, 2, 3, 1, 2, 3, 1, 2, 3]
3.17.2 数组与数组
维度相等才可以运算 或者满足广播机制
广播机制(满足如下的条件之一即可运算)
1.数组的某一维度等长 2.其中一个数组的某一维度为1
下面用一个例子来帮助理解
>>>a1 = np.array([[1,2,3],[4,5,6]]) >>>a2 = np.array([[1],[2]]) >>>a = a1 + a2 >array([[2, 3, 4], [6, 7, 8]])
3.17.3 矩阵乘法
方法 | 作用 |
---|---|
np.matmul | 矩阵与矩阵相乘(禁止出现矩阵与标量相乘) |
np.dot | 矩阵与矩阵和标量相乘皆可 |
注意:在矩阵与矩阵相乘时,二者没有区别
四、Pandas工具
4.1pandas安装
打开cmd,输入以下代码
pip install pandas
安装完成后,再次输入以下代码检查是否安装成功
pip list
4.2 导入库
import pandas as pd
4.3 三种主要的数据结构
数据结构 | 描述 |
---|---|
Series | 一维数据结构 |
DataFrame | 二维数据结构 |
MultiIndex | 三维数据结构 |
Panel | 三维数据结构(MultiIndex老版本) |
4.4 Series(了解即可)
注意:后面的series均代指一维的对象名称(可以是series,也可以代指dataframe中的某一列或一行)
pd.Series(data = None,index = None,dtype = None)
data:传入的数据,可以是ndarray,list等 index:索引,必须是唯一的,且与数据的长度相等,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引 dtype:数据的类型 可以通过字典键值对来实现
属性 | 作用 |
---|---|
series.index | 获取索引 |
series.values | 获取值 |
4.5 DataFrame
注意:后面的dataframe均代指二维的对象名称
pd.DataFrame(data = None,index = None,columns = None)
index:行标签,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引 columns:列标签,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引
下面用一个例子来帮助理解
>>>a = [1,2,3,4] >>>b = [5,6,7,8] >>>c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a,columns = b) > 5 6 7 8 1 23 28 85 59 2 52 81 45 7 3 70 54 71 15 4 70 35 27 89
属性 | 作用 |
---|---|
dataframe.shape | 获取维度 |
dataframe.index | 获取行索引表 |
dataframe.columns | 获取列索引表 |
dataframe.values | 获取其中array的值 |
dataframe.T | 行列互换(转置) |
dataframe.head() | 默认获取前5行,其他行数自行添加 |
dataframe.tail() | 默认获取后5行,其他行数自行添加 |
dataframe.info | 获取每一列的非空元素个数 |
4.5.1 DataFrame索引设置
4.5.1.1 修改行列索引值
data.index = new_index data.columns = new_columns
注意:修改索引值不能单个修改,必须整体修改
4.5.1.2 重设索引
dataframe.reset_index(drop = False)
设置新的下标索引 drop:默认为False,不删除原来索引,如果为True,删除原来索引值
4.5.1.3 以某列值设置为新的索引
dataframe.set_index(keys,drop = True)
keys:列索引命或者列索引名称的列表 drop:bool值默认为True,当做新的索引,删除原来的列
注意:行索引的修改与重设类似列索引
4.6 Multilndex(了解即可)
可以在Series、DataFrame对象上拥有2个及2个以上的索引
pd.MultiIndex(levels,labels,names)
levels:索引的名称 labels:索引在默认索引中的位置 name:索引的头名
下面用一个例子来帮助理解
>>>arrays = [[2012,2014,2013,2014],[1,4,7,10]] >>>data = pd.MultiIndex.from_arrays(arrays, names = ['year','month']) >MultiIndex(levels = [[2012, 2013, 2014], [1, 4, 7, 10]], labels = [[0, 2, 1, 2], [0, 1, 2, 3]], names = ['year', 'month']) > untitled year month 2012 1 null 2014 4 null 2013 7 null 2014 10 null
注意: 1.year的索引是2012,2014,2013,2014,分别对应levels中的第一个,第三个,第二个,第三个,即labels中的[0, 2, 1, 2] 2.未填写具体的值与索引所以会显示untitled和null
4.7 Panel(了解即可)
class pandas.Panel(data = None,items = None,major_axis = None,min_axis = None)
作用:存储3维数组的panel结构 data:ndarray或dataframe items:索引或类似数组的对象,axis=0 major_axis:索引或类似数组的对象,axis=1 minor_axis:索引或类似数组的对象,axis=2 注意:通过索引查看
4.8 基本数据操作
4.8.1 索引操作
Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持 类似的操作。也可以直接使用列名、行名称,甚至组合使用。
4.8.1.1 直接使用行列索引(先列后行)
>>>a = [1,2,3,4] >>>b = [5,6,7,8] >>>c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b) > 5 6 7 8 1 23 28 85 59 2 52 81 45 7 3 70 54 71 15 4 70 35 27 89 >>>c[5][3] >70 >>>c[:1,:2] #这样会报错 >TypeError: unhashable type: 'slice'
4.8.1.2 结合loc或者iloc使用索引
使用loc:只能指定行列索引的名字(先行后列) 使用iloc:可以通过索引的下标去获取 使用ix组合索引:下标和名称组合做引(版本较老)
可以使用以下两种方式来代替ix组合索引 1.dataframe.loc[dataframe.index[ a: b],['c','d']] 2.dataframe.iloc[ : ,dataframe.columns.get_indexer(['c','d'])]
下面用一个例子来帮助理解
4.8.2赋值操作
dataframe['a'] = b dataframe.a = b
注意: 1.a代表某一列或者某一行的名称 2.b代表某个值
下面用一个例子来帮助理解
4.9 排序
4.9.1 DataFrame排序
dataframe.sort_values(by = ,ascending =)
单个或多个键排序 by:指定排序参考的键 ascending:默认升序 ascending = False 降序 ascending = True 升序
4.9.2 Series排序
进行值排序
dataframe.sort_values(ascending = True)
进行索引排序
series.sort_index()
4.10 DataFrame运算
4.10.1 基本运算
元素相加,维度相等时找不到元素默认用fill_value
dataframe.add(dataframe2, fill_value = None, axis = 1)
元素相减,维度相等时找不到元素默认用fill_value
dataframe.sub(dataframe2, fill_value = None, axis = 1)
元素相除,维度相等时找不到元素默认用fill_value
dataframe.div(dataframe2, fill_value = None, axis = 1)
元素相乘,维度相等时找不到元素默认用fill_value
dataframe.mul(dataframe2, fill_value = None, axis = 1)
查看日期,输入具体日期
直接通过一个例子来辅助理解
>>>data = np.array(['2023-3-12','2023-3-13','2023-3-14']) >>>data1 = pd.to_datetime(data) >>>data1.week >Int64Index([10, 11, 11], dtype = 'int64') >>>data1.weekday >Int64Index([6, 0, 1], dtype = 'int64') >>>data1.day >Int64Index([12, 13, 14], dtype = 'int64')
4.10.2 逻辑运算
直接通过一个例子辅助理解(这部分在Numpy中有提到过,现在拿出来重提是为了与下面的逻辑运算函数进行对比)
>>>a = ['a','b','c','d'] >>>b = ['a1','b1','c1','d1'] >>>c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b) > a1 b1 c1 d1 a 22 14 93 36 b 86 77 41 5 c 96 84 37 84 d 89 94 54 97 >>>c[(c['d1']>50) & (c['d1']<90)].head() > a1 b1 c1 d1 c 96 84 37 84
4.10.3 逻辑运算函数
query(expr)
expr:查询字符串 通过逻辑运算函数可以使上面的过程更加方便简单
>>>a = ['a','b','c','d'] >>>b = ['a1','b1','c1','d1'] >>>c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b) > a1 b1 c1 d1 a 22 14 93 36 b 86 77 41 5 c 96 84 37 84 d 89 94 54 97 >>>c.query("d1>50 & d1<90") > a1 b1 c1 d1 c 96 84 37 84
isin(values)
判断是否有这个值
下面用一个例子来帮助理解
>>>a = ['a','b','c','d'] >>>b = ['a1','b1','c1','d1'] >>>c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b) > a1 b1 c1 d1 a 24 99 77 39 b 25 61 41 70 c 29 8 83 95 d 26 4 42 21 >>>c.isin([24,80]) > a1 b1 c1 d1 a True False False False b False False False False c False False False False d False False False False
4.10.4 统计运算
dataframe.describe()
综合统计包括平均值,最大值,最小值等等
4.10.4.1 统计函数
函数 | 作用 |
---|---|
sum | 获取总和 |
mean | 获取平均值 |
median | 获取中位数 |
min | 获取最小值 |
max | 获取最大值 |
mode | 获取众数 |
abs | 获取绝对值 |
prod | 获取累积 |
std | 获取标准差 |
var | 获取方差 |
idxmax | 获取最大值索引 |
idxmin | 获取最小值索引 |
4.10.4.2 累计统计函数
函数 | 作用 |
---|---|
cumsum | 计算1/2/3/……/n个数的和 |
cummax | 计算1/2/3/……/n个数的最大值 |
cummin | 计算1/2/3/……/n个数的最小值 |
cumprod | 计算1/2/3/……/n个数的积 |
4.10.4.3 自定义运算
apply(func,axis=0)
func:自定义运算 axis=0默认是列,axis=1为行进行运算
4.11 Pandas画图
dataframe.plot(kind='line')
kind:str,需要绘制图形的种类
图形种类
种类 | 描述 |
---|---|
line | 折线图 |
bar | 条形图(竖直条状) |
bath | 条形图(水平条状) |
hist | 直方图 |
pie | 饼图 |
scatter | 散点图 |
注意: 1.条形图中可以添加是否堆积dataframe.plot(kind='bar',stacked=True) 2.stacked为True时堆积,为False时不堆积
具体过程跟matplotlib中类似,这里主要介绍利用pandas创造的二维对象dataframe,使用plot可以直接将dataframe转换成数据图类型
下面通过一个例子来辅助理解
>>>a = ['a','b','c','d'] >>>b = ['a1','b1','c1','d1'] >>>c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a,columns = b) >>>plt.figure(figsize = (20,8),dpi = 100) >>>c.plot(kind='bar',stacked=True) >>>plt.savefig(r"D:\data\python\exercise\test1\8.png") >>>plt.show()
4.12 文件读取与文件存储
类 | 数据类型 | 读取文件 | 存储文件 |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | JSON | read_json | to_json |
text | HTML | read_html | to_json |
text | Local clipboard | read_clipboard | to_clipboard |
binary | MS Excel | read_excel | to_excel |
binary | HDF5 Format | read_hdf | to_hdf |
binary | Feather Format | read_feather | to_feather |
binary | Parquet Format | read_parquet | to_parquet |
binary | Msgpack | read_msgpack | to_msgpack |
binary | Stata | read_stata | to_stata |
binary | SAS | read_sas | -- |
binary | Python Pickle Format | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
SQL | Google Big Query | read_gbp | to_gbp |
4.12.1 CSV
4.12.1.1 read_csv
pd.read_csv(filepath_or_buffer,sep = ',',usecols = None)
filepath_or_buffer:文件路径 sep:分隔符,默认用','隔开 usecols:指定读取的列名,列表形式
4.12.1.2 to_csv
dataframe.to_csv(path_or_buffer=None,sep = ',',columns = None,header = True,index = True,mode = 'w',encoding = None)
path_or_buf:文件路径 sep:分隔符,默认用','隔开 columns:选择需要的列索引 header:是否写进列索引值 index:是否写进行索引值 mode:'w':重写,'a':追加
4.12.2 HDF5
需要安装tables模块以避免不能读取hdf文件 安装tables模块,打开cmd,输入以下代码:
pip install tables
4.12.2.1 read_hdf
pd.read_hdf(path_or_buffer,key = None,**kwargs)
path_or_buffer:文件路径 可以:读取的键
4.12.2.2 to_hdf
dataframe.to_hdf(path_or_buffer,key = None,**kwargs)
注意: 1.优先HDF5文件进行存储 2.HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的 3.使用压缩可以提高磁盘利用率,节省空间 4.HDF5还是跨平台的,可以轻松迁移到Hadoop上面
4.12.3 JSON
4.12.3.1 read_json
pd.read_json(path_or_buffer = None,orient = None,typ = 'frame',lines = False)
将JSON格式准换成默认的Pandas DataFrame格式 orient:String,指示预期的JSON字符串格式。
orient
类型 | 输出形式 | 描述 |
---|---|---|
'split' | dict like {index -> [index],columns -> [columns], data -> [values]} | split 将索引总结到索引,列名到列名,数据到数据,将三部分都分开了 |
'records' | list like [{column -> value}, .. , {column -> value}] | records以columns: values 的形式输出 |
'index' | dict like {index -> {column -> value}} | index以index: {columns: values}... 的形式输出 |
'columns' | dict like {column -> {index -> value}},默认该格式 | columns 以columns:{index:values} 的形式输出 |
'values' | -- | values 直接输出值 |
lines:按照每行读取json对象 typ:指定转换成的对象类型series或dataframe
4.12.3.2 to_json
dataframe.to_json(path_or_buffer = None,orient = None,lines = False)
path_or_buffer=None:文件地址 orient:存储json的形式('split','reconds','index','columns','values') lines:一个对象存储为一行
五、高级数据处理
5.1 缺失值处理
首先需要获取缺失值的标记方式(NAN或者其他标记方式,一般来说都是NAN)
5.1.1 判断数据中是否包含NAN
方法 | 描述 |
---|---|
pd.isnull(dataframe) 或dataframe.isnull() | 有缺失值返回True,没有缺失值返回False |
pd.notnull(dataframe)或dataframe.isnull() | 没有缺失值返回True,有缺失值返回False |
下面举个例子来辅助理解:
5.1.2 删除存在缺失值的对象
dataframe.dropna(axis = 0)
默认删除缺失值所在行,可以通过设置axis=1删除所在列 注意:这里不会修改原数据,需要接收返回值
5.1.3 替换缺失值
dataframe.fillna(value, inplace = True)
value:替换成的值 inplace:True则会修改原数据,False则不替换修改原数据,生成新的对象
5.1.4 缺失值没有使用NAN标记
通过如下代码将其他标记(比如’?‘)替换为NAN,再使用上面的方法处理
dataframe.replace(to_replace = '?',value = np.nan)
5.2 数据离散化
5.2.1 为什么要离散化
连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
5.2.2 什么是数据的离散化
连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。 注意:数据离散化要分组和one-hot搭配使用 离散化有很多种方法,这使用一种最简单的方式去操作 人的身高数据: 165,174,160,180,159,163,192,184 最设按照身高分几个区间段: 150-165, 165-180,180-195 这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个“哑变量”矩阵
5.2.3 分组
5.2.3.1 默认分组
pd.qcut(data, q)
注意:这里的分组是自动分成差不多数量的类别 对数据列进行分组,一般会与value_counts()(统计分组个数)搭配使用,返回分好组的数据 data:待分组的数据 q:分成多少组
统计分组次数
series.values_counts()
5.2.3.2 自定义分组
pd.cut(data,bins)
data:待分组的数据 bins:指定分组类型,可以是整型,或列表类型(表中数据间隔则为分组范围)
5.2.4 One-hot编码(哑变量)
把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。 把下图中左边的表格转化为使用右边形式进行表示
sample prize sample prize_5 prize_10 prize_20 1 10 1 0 1 0 2 20 2 0 0 1 3 10 => 3 0 1 0 4 5 4 1 0 0 5 10 5 0 1 0
pandas.get_dummies(data, prefix = None)
data:array-like, Series, or DataFrame prefix:分组名字
5.3 合并
5.3.1 pd.concat
pd.concat([data1, data2], axis = 1)
按照行或列进行合并,axis=0为扩展行,axis=1为扩展列
5.3.2 pd.merge
pd.merge(left, right, how = 'inner', on = None)
可以指定按照两组数据的共同键值对合并或者左右各自 left : dataframe right :另一个dataframe on :指定的共同键 how:按照什么方式连接
5.3.2.1 how的方式
方式 | 作用 | 描述 |
---|---|---|
left | 左连接 | 左边加左右交集的部分 |
right | 右连接 | 右边加左右交集的部分 |
outer | 外连接 | 并集部分 |
inner | 内连接 | 交集部分 |
5.4 交叉表与透视表
5.4.1 交叉表
交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
pd.crosstab(value1, value2)
5.4.2 透视表
透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
data.pivot .table() DataFrame.pivot_table([],index = [])
5.5 分组与聚合
5.5.1 分组
DataFrame.groupby(key, as_index = True)
key:分组的列数据,可以多个 as_index:若为True则不保留原来的索引,若为False则保留原来的索引
5.5.2 聚合
一般是指对分组中的数据执行某些操作,比如求平均值、最大值等,并且会得到一个结果集。