机器学习入门基本使用工具(保姆式教学):matplotlib,numpy,pandas这一篇就够了

学习机器学习,以及python会用到一些工具,小编在这里列举一些出来,足够正常的机器学习使用,一些不常用的工具小编这里学的也不多,不过这篇博客会后续继续更新。
注意:代码中含有>>>的部分均是代码行,只有一个>时表示输出结果

文章目录

1.机器学习基本使用工具

常用的工具有如下几个

工具作用
matplotlib画图工具
numpy表格处理工具
padas信息处理工具

2.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:图例

常用color

颜色说明颜色说明
r红色g绿色
b蓝色w白色
c青色m洋红
y黄色k黑色

英文名称版
在这里插入图片描述
RGB颜色版
在这里插入图片描述

标记风格

标记字符说明标记字符说明
‘.’点标记‘,’像素标记(极小点)
‘v’倒三角标记’^‘上三角标记
‘>’右三角标记‘<’左三角标记
‘1’下花三角标记‘2’上花三角标记
‘3’左花三角标记‘4’右花三角标记
‘o’实心圈标记‘s’实心方形标记
‘p’实心五角标记‘*’星形标记
‘h’竖六边形标记‘H’横六边形标记
‘+’十字标记‘x’x标记
‘D’菱形标记‘d’瘦菱形标记

线条样式

样式说明
’-‘实线
’–‘虚线
’-.‘点划线
‘:’点虚线

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 基本统计图

折线图

在不设置需要画统计图的类型之前,默认画的是折线图

下面通过一个例子来辅助理解

>>>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()

在这里插入图片描述

散点图

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()

在这里插入图片描述

柱状图

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()

在这里插入图片描述

直方图

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()

在这里插入图片描述

饼图

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()

在这里插入图片描述

3.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整数,-231至231-1‘i4’
np.int64整数,-263至263-1‘i8’
np.uint8无符号整数,0至255‘u’
np.uint16无符号整数,0至65535‘u2’
np.uint32无符号整数,0至232-1‘u4’
np.uint64无符号整数,0至264-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’

注意
1.np.object_,np.string_,np.unicode_这三种类型后面加上“_”
2.np.unicode_简写类型为大写的’U’,np.uint8简写类型位小写的’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 生成固定范围内的数组

np.linspace

np.linspace(start, stop, num, endpoint) 	

创建等差数组,指定数量(步长自动计算)
start:序列的起始值
stop:序列的结束值
num:要生成的等间隔样例数量,默认为50
endpoint:序列中是否包含stop值,默认为true

np.arange

np.arange(start,stop,step,dtype) 			

创建等差数组,指定步长(数量自动计算)
step:步长,默认为1

np.logspace

np.logspace(start,stop,num)					

创建等比数组,生成以10的N次幂的数据
num:要生成的等比数组数量,默认为50

3.9生成随机数组

np.random模块

导入库
import random

正态分布

第一种: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)

返回指定形状的标准正态分布的数组

均匀分布

第一种: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 形状修改

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)

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是产生一个新的对象对自身不做变化

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 类型修改

ndarray.astype

ndarray.astype(type)

返回修改类型之后的数组

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运算

逻辑运算

np.logical_and
np.logical_and(condition1,condition2)

condition:条件
当两个条件同时满足时返回Ture

np.logical_or
np.logical_or(condition1,condition2)

当其中一个条件满足时返回Ture

np.all
np.all()

所有条件都满足要求返回True,有任一个不满足返回False

np.any
np.any()

任一个条件满足要求返回True

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]])

注意
1.使用random函数时记得导入库
2.使用索引进行切片时是先行后列
3.test_score > 60这里是进行运算,返回为bool值
4.test_score[test_score > 60] = 1这里是bool赋值,将满足条件的设置为特定的值——布尔索引

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 数组间的运算

数组与数

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]

数组与数组

维度相等才可以运算
或者满足广播机制

广播机制(满足如下的条件之一即可运算)

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]])

矩阵乘法

方法作用
np.matmul矩阵与矩阵相乘(禁止出现矩阵与标量相乘)
np.dot矩阵与矩阵和标量相乘皆可

注意:在矩阵与矩阵相乘时,二者没有区别

4.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获取每一列的非空元素个数

DataFrame索引设置

修改行列索引值
data.index = new_index
data.columns = new_columns

注意:修改索引值不能单个修改,必须整体修改

重设索引
dataframe.reset_index(drop = False)

设置新的下标索引
drop:默认为False,不删除原来索引,如果为True,删除原来索引值

以某列值设置为新的索引
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 基本数据操作

索引操作

Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持 类似的操作。也可以直接使用列名、行名称,甚至组合使用。

直接使用行列索引(先列后行)
>>>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'
结合loc或者iloc使用索引

使用loc:只能指定行列索引的名字(先行后列
使用iloc:可以通过索引的下标去获取
使用ix组合索引:下标和名称组合做引(版本较老)

可以使用以下两种方式来代替ix组合索引
1.dataframe.loc[dataframe.index[ a: b],[‘c’,‘d’]]
2.dataframe.iloc[ : ,dataframe.columns.get_indexer([‘c’,‘d’])]

下面用一个例子来帮助理解

>>>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	89	79	12	74
b	52	20	84	49
c	43	56	25	3
d	69	78	58	6
>>>c.loc[ : ,'a1']
>a    89
 b    52
 c    43
 d    69
 Name: a1, dtype: int32
>>>c.iloc[:,0]
>a    89
 b    52
 c    43
 d    69
 Name: a1, dtype: int32
>>>c.loc[c.index,['a1']]
>
	a1
a	89
b	52
c	43
d	69
>>>c.iloc[:,c.columns.get_indexer(['a1'])]
>
	a1
a	89
b	52
c	43
d	69

赋值操作

dataframe['a'] = b
dataframe.a = b

注意
1.a代表某一列或者某一行的名称
2.b代表某个值

下面用一个例子来帮助理解

>>>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	46	89	26	76
b	28	85	18	22
c	74	81	71	27
d	39	88	44	83
>>>c['b1'] = 1
>
	a1	b1	c1	d1
a	46	1	26	76
b	28	1	18	22
c	74	1	71	27
d	39	1	44	83
>>>c.d1 = 2
>	
	a1	b1	c1	d1
a	46	1	26	2
b	28	1	18	2
c	74	1	71	2
d	39	1	44	2

4.9 排序

DataFrame排序

dataframe.sort_values(by = ,ascending =)	

单个或多个键排序
by:指定排序参考的键
ascending:默认升序
ascending = False 降序
ascending = True 升序

Series排序

进行值排序

dataframe.sort_values(ascending = True) 

进行索引排序

series.sort_index()

4.10 DataFrame运算

基本运算

元素相加,维度相等时找不到元素默认用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')

逻辑运算

直接通过一个例子辅助理解(这部分在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

逻辑运算函数

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

统计运算

dataframe.describe()

综合统计包括平均值,最大值,最小值等等

统计函数
函数作用
sum获取总和
mean获取平均值
median获取中位数
min获取最小值
max获取最大值
mode获取众数
abs获取绝对值
prod获取累积
std获取标准差
var获取方差
idxmax获取最大值索引
idxmin获取最小值索引
累计统计函数
函数作用
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为行进行运算

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 文件读取与文件存储

数据类型读取文件存储文件
textCSVread_csvto_csv
textJSONread_jsonto_json
textHTMLread_htmlto_json
textLocal clipboardread_clipboardto_clipboard
binaryMS Excelread_excelto_excel
binaryHDF5 Formatread_hdfto_hdf
binaryFeather Formatread_featherto_feather
binaryParquet Formatread_parquetto_parquet
binaryMsgpackread_msgpackto_msgpack
binaryStataread_statato_stata
binarySASread_sas
binaryPython Pickle Formatread_pickleto_pickle
SQLSQLread_sqlto_sql
SQLGoogle Big Queryread_gbpto_gbp

CSV

read_csv
pd.read_csv(filepath_or_buffer,sep = ',',usecols = None)

filepath_or_buffer:文件路径
sep:分隔符,默认用’,'隔开
usecols:指定读取的列名,列表形式

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’:追加

HDF5

需要安装tables模块以避免不能读取hdf文件
安装tables模块,打开cmd,输入以下代码:

pip install tables
read_hdf
pd.read_hdf(path_or_buffer,key = None,**kwargs)

path_or_buffer:文件路径
可以:读取的键

to_hdf
dataframe.to_hdf(path_or_buffer,key = None,**kwargs)

注意
1.优先HDF5文件进行存储
2.HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的
3.使用压缩可以提高磁盘利用率,节省空间
4.HDF5还是跨平台的,可以轻松迁移到Hadoop上面

JSON

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

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.高级数据处理

5.1 缺失值处理

首先需要获取缺失值的标记方式(NAN或者其他标记方式,一般来说都是NAN)

判断数据中是否包含NAN

方法描述
pd.isnull(dataframe) 或dataframe.isnull()有缺失值返回True,没有缺失值返回False
pd.notnull(dataframe)或dataframe.isnull()没有缺失值返回True,有缺失值返回False

下面举个例子来辅助理解:

>>>data = pd.read_csv(r"D:\data\python\taitanic\train.csv")
>
	PassengerId	Survived	Pclass						Name							Sex		Age		SibSp	Parch	Ticket			Fare	Cabin	Embarked
0		1		0			3		Braund, Mr. Owen Harris		`						male	22.0	1		0		A/5 21171		7.2500	NaN		S
1		2		1			1		Cumings, Mrs. John Bradley (Florence Briggs Th...	female	38.0	1		0		PC 17599		71.2833	C85		C
2		3		1			3		Heikkinen, Miss. Laina								female	26.0	0		0	STON/O2. 3101282	7.9250	NaN		S
3		4		1			1		Futrelle, Mrs. Jacques Heath (Lily May Peel)		female	35.0	1		0		113803			53.1000	C123	S
4		5		0			3		Allen, Mr. William Henry							male	35.0	0		0		373450			8.0500	NaN		S
>>>pd.isnull(data).head()
>	
	PassengerId	Survived	Pclass	Name	Sex		Age		SibSp	Parch	Ticket	Fare	Cabin	Embarked
0	False		False		False	False	False	False	False	False	False	False	True	False
1	False		False		False	False	False	False	False	False	False	False	False	False
2	False		False		False	False	False	False	False	False	False	False	True	False
3	False		False		False	False	False	False	False	False	False	False	False	False
4	False		False		False	False	False	False	False	False	False	False	True	False
>>>data.notnull().head()
>
	PassengerId	Survived	Pclass	Name	Sex		Age		SibSp	Parch	Ticket	Fare	Cabin	Embarked
0	True		True		True	True	True	True	True	True	True	True	False	True
1	True		True		True	True	True	True	True	True	True	True	True	True
2	True		True		True	True	True	True	True	True	True	True	False	True
3	True		True		True	True	True	True	True	True	True	True	True	True
4	True		True		True	True	True	True	True	True	True	True	False	True

删除存在缺失值的对象

dataframe.dropna(axis = 0)

默认删除缺失值所在行,可以通过设置axis=1删除所在列
注意:这里不会修改原数据,需要接收返回值

替换缺失值

dataframe.fillna(value, inplace = True)

value:替换成的值
inplace:True则会修改原数据,False则不替换修改原数据,生成新的对象

缺失值没有使用NAN标记

通过如下代码将其他标记(比如’?‘)替换为NAN,再使用上面的方法处理

dataframe.replace(to_replace = '?',value = np.nan)

5.2 数据离散化

为什么要离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。

什么是数据的离散化

连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
注意:数据离散化要分组和one-hot搭配使用
离散化有很多种方法,这使用一种最简单的方式去操作
人的身高数据: 165,174,160,180,159,163,192,184
最设按照身高分几个区间段: 150-165, 165-180,180-195
这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个“哑变量”矩阵

分组

默认分组
pd.qcut(data, q)

注意:这里的分组是自动分成差不多数量的类别
对数据列进行分组,一般会与value_counts()(统计分组个数)搭配使用,返回分好组的数据
data:待分组的数据
q:分成多少组

统计分组次数

series.values_counts()
自定义分组
pd.cut(data,bins)

data:待分组的数据
bins:指定分组类型,可以是整型,或列表类型(表中数据间隔则为分组范围)

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 合并

pd.concat

pd.concat([data1, data2], axis = 1)

按照行或列进行合并,axis=0为扩展行,axis=1为扩展列

pd.merge

pd.merge(left, right, how = 'inner', on = None)

可以指定按照两组数据的共同键值对合并或者左右各自
left : dataframe
right :另一个dataframe
on :指定的共同键
how:按照什么方式连接

how的方式
方式作用描述
left左连接左边加左右交集的部分
right右连接右边加左右交集的部分
outer外连接并集部分
inner内连接交集部分

5.4 交叉表与透视表

交叉表

交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)

pd.crosstab(value1, value2)

透视表

透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数

data.pivot .table()
DataFrame.pivot_table([],index = [])

5.5 分组与聚合

分组

DataFrame.groupby(key, as_index = True)

key:分组的列数据,可以多个
as_index:若为True则不保留原来的索引,若为False则保留原来的索引

聚合

一般是指对分组中的数据执行某些操作,比如求平均值、最大值等,并且会得到一个结果集。

总结

以上就是机器学习入门的基本使用工具,以后还会不断更新新的知识点。
如果你觉得这篇文章对你有用,建议点赞收藏。
欢迎各位读者指正错误,请在评论区留言。或者发表自己的看法,小编不胜感激。

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值