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

文章目录

1.机器学习基本使用工具2.Matplotlib工具2.1 matplotlib安装2.2 导入库2.3 创建画布2.4 绘制图像常用color标记风格线条样式

2.5 添加自定义x,y刻度2.6 设置x,y标签和标题2.7 添加网格显示2.8 设置图例位置loc位置表

2.9 设置画板多图2.10 图像保存2.11 显示图像2.12 中文显示问题2.13 基本统计图折线图散点图柱状图直方图饼图

2.14 绘制简单的数学图像2.15 绘制较复杂的图像

3.Numpy工具3.1 numpy安装3.2 导入库3.3 创建ndarray3.4 基本方法3.5 创建数组时指定类型3.6 生成只含0和1的数组3.7 从现有数组中生成np.array和np.asarray的区别

3.8 生成固定范围内的数组np.linspacenp.arangenp.logspace

3.9生成随机数组np.random模块导入库

正态分布第一种:np.random.randn第二种:np.random.normal第三种:np.random.standard_normal

均匀分布第一种:np.random.rand第二种:np.random.uniform第三种:np.random.randint

3.10 数组索引,切片3.11 形状修改ndarray.reshapendarray.resizendarray.T

3.12 类型修改ndarray.astypendarray.tostring和ndarray.tobytes

3.13 数组的去重3.14 ndarray运算逻辑运算np.logical_andnp.logical_ornp.allnp.anynp.where(三元运算符)

3.15 布尔赋值3.16 统计指标3.17 数组间的运算数组与数数组与数组广播机制(满足如下的条件之一即可运算)

矩阵乘法

4.Pandas工具4.1pandas安装4.2 导入库4.3 三种主要的数据结构4.4 Series(了解即可)4.5 DataFrameDataFrame索引设置修改行列索引值重设索引以某列值设置为新的索引

4.6 Multilndex(了解即可)4.7 Panel(了解即可)4.8 基本数据操作索引操作直接使用行列索引(先列后行)结合loc或者iloc使用索引

赋值操作

4.9 排序DataFrame排序Series排序

4.10 DataFrame运算基本运算查看日期,输入具体日期

逻辑运算逻辑运算函数统计运算统计函数累计统计函数自定义运算

4.11 Pandas画图图形种类

4.12 文件读取与文件存储CSVread_csvto_csv

HDF5read_hdfto_hdf

JSONread_jsonorient

to_json

5.高级数据处理5.1 缺失值处理判断数据中是否包含NAN删除存在缺失值的对象替换缺失值缺失值没有使用NAN标记

5.2 数据离散化为什么要离散化什么是数据的离散化分组默认分组自定义分组

One-hot编码(哑变量)

5.3 合并pd.concatpd.mergehow的方式

5.4 交叉表与透视表交叉表透视表

5.5 分组与聚合分组聚合

总结

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最佳位置0upper right右上方1upper left左上方2lower left左下方3lower right右下方4right右边5center left中间左边6center right中间右边7lower center下方中间8upper center上方中间9center正中心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_csvtextJSONread_jsonto_jsontextHTMLread_htmlto_jsontextLocal clipboardread_clipboardto_clipboardbinaryMS Excelread_excelto_excelbinaryHDF5 Formatread_hdfto_hdfbinaryFeather Formatread_featherto_featherbinaryParquet Formatread_parquetto_parquetbinaryMsgpackread_msgpackto_msgpackbinaryStataread_statato_statabinarySASread_sas–binaryPython Pickle Formatread_pickleto_pickleSQLSQLread_sqlto_sqlSQLGoogle 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,没有缺失值返回Falsepd.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则保留原来的索引

聚合

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

总结

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

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: