二、机器学习
1.Matplotlib工具
**(1)使用方法: ** import matplotlib.pyplot as plt //导入库
plt.figure(figsize = (a,b),dpi = ) //创建画布
(figsize:图像的长(a)和宽(b);dpi:图像清晰度(越大越清晰))
plt.plot(x,y,color=‘’,linewidth=‘’,marker=‘’,label=‘’,linestyle=‘’)//绘制图像
(x:横轴数据;y:纵轴数据;color:图像颜色[可直接输入英文,也可输 入RGB颜色值];linewidth:线条宽度;marker:标记风格;linestyle:线 条样式;label:图例)
//添加自定义x,y刻度
plt.xticks(x,rotation=,fontsize=)
plt.yticks(y,rotation=,fontsize=)
(x/y:要显示的刻度值;rotation:旋转角度;fontsize:字体大小)
注:传递进去的第一个参数必须是数字
//设置x,y标签和标题
plt.xlabel( ,fontsize=)
plt.ylabel( ,fontsize=)
plt.title( ,fontsize=)
plt.grid(True,linestyle= ,alpha=) //添加网格显示(alpha:代表透明度)
plt.legend(loc=) //设置图例位置(loc:图例所在位置)
//设置画板多图
matplotlib.pyplot.add_subplot(nrows,ncols,**fig_kw)
(nrows:第几行;ncols:第几列;**fig_kw:代表第几个图)
//中文显示问题
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.savefig(文件地址) //图像保存
plt.show() //显示图像
(2)折线图:
>>>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()
(3)散点图:
>>>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()
(4)柱状图:
plt.bar(x,width=,height=,label=,alpha=,align=,color=)
x:柱状图中的横坐标
height:柱状图对应每个横坐标的高度值
width:柱状图的宽度,默认为0.8
label:每个数据样本对应的图例,调用legend()可以显示图例
alpha:透明度
align:每个柱状图的对齐方法
color:柱状图的颜色
(4)直方图:
>>>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()
x:需要传递的数据
bins:组距
(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={}:表示控制扇形或锲形属性的字典
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.Numpy工具
(1)导入库: import numpy as np
**(2)创建ndarray:**data = np.array()
**(3)基本方法:**1.data.shape:查看数组的维度(以元组形式输出)
2.data.ndim:查看数组维数
3.data.size:查看数组的元素数量
4.data.itemsize:查看一个数组的长度
5.data.dtype:查看数组元素的类型
(4)创建数组指定类型:
名称 | 描述 |
---|---|
np.bool(‘b’) | 用一个字节存储的布尔类型(True或False) |
np.int8(‘i’) | 一个字节大小,-128至127 |
np.int16(‘i2’) | 整数,-32768至32767 |
np.int32(‘i4’) | 整数,-231至231-1 |
np.int64(‘i8’) | 整数,-263至263-1 |
np.uint8(‘u’) | 无符号整数,0至255 |
np.uint16(‘u2’) | 无符号整数,0至65535 |
np.uint32(‘u4’) | 无符号整数,0至232-1 |
np.uint64(‘u8’) | 无符号整数,0至264-1 |
np.float16(‘f2’) | 半精度浮点数,16位,正负号1位,指数5倍,精度10位 |
np.float32(‘f4’) | 半精度浮点数,32位,正负号1位,指数8倍,精度23位 |
np.float64(‘f8’) | 半精度浮点数,64位,正负号1位,指数11倍,精度52位 |
np.complex64(‘c8’) | 复数,分别用两个32位浮点数表示实部和虚部 |
np.complex128(‘c16’) | 复数,分别用两个64位浮点数表示实部和虚部 |
np.object_(‘o’) | python对象 |
np.string_(‘s’) | 字符串 |
np.unicode_(‘U’) | unicode类型 |
**(5)生成只含0和1的数组:**1.np.ones([index,columns]):生成index行,columns列且所有元 素都为1的数组
2.np.zeros([index,columns]):生成index行,columns列且所有元 素都为0的数组
3.np.ones_like(ndarray):生成一个行数和列数都与ndarry相同 的且所有元素均为1的数组
4.np,zeros_like(ndarray):生成一个行数和列数都与ndarry相同 的且所有元素均为0的数组
注:生成一个行数和列数都与ndarry相同的且所有元素均为0的数组
**(6)从现有数组中生成:**1.data1=np.array(data):对data进行复制,但数组data中的元素 变化对data1没有影响
2.data2=np.asarray(data):对data进行复制,但数组data2中的元 素跟着数组data中的元素改变
**(7)生成固定范围内的数组:**1.np.logical_and(condition1,condition2): condition:条件 当两个条件同时满足时返回True
2.np.logical_or(condition1,condition2): 当其中一个条件满足时返回True
3.np.all():所有条件都满足条件返回True,否则返回False
4.np.any():任一个条件满足要求返回True
5.np.where(condition,1,0):满足条件返回1,不满足返回0
注:复合逻辑需要结合np.logical_and和np.logical_or使用
(8)布尔赋值:
例:
>>>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赋值,将满足条件的设置为 特定的值——布尔索引
(9)统计指标:
方法 | 作用 |
---|---|
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) | 查询最小值的位置 |
**(10)数组与数:**1.ndarray+1:数组里每个元素+1
2.ndarray/2:数组里每个元素/2
3.ndarray *2:数组里每个元素 *2
**(11)数组与数组:**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]])
**(12)矩阵乘法:**1.np.matmul:矩阵与矩阵相乘(禁止出现矩阵与标量相乘)
2.np.dot:矩阵与矩阵和标量相乘皆可
注:在矩阵与矩阵相乘时,二者没有区别
3.Pandas工具
(1)导入库: import pandas as pd
**(2)主要数据结构:**1.Series:一维数据结构
2.DataFrame:二维数据结构
3.Multilndex:三维数据结构
4.Panel:三维数据结构(老版本)
**(3)Series:**1.pd.Series(data = None,index = None,dtype = None)
data:传入的数据,可以是ndarray,list等形式 index:索引,必须是唯一的,且与数据长度相等,没有传入参数时会默认 创建一个0-N的整数索引 dtype:数据的类型
2.series.index:获取索引
series.values:获取值
**(4)DataFrame:**1.pd.DataFrame(data = None,index = None,columns = None)
index:行标签;columns:列标签
2.dataframe.shape:获取维度
dataframe.index:获取行索引表
dataframe.columns:获取列索引表
dataframe.values:获取其中array的值
dataframe.T:行列互换
dataframe.head():默认获取前5行,其他行数自行添加
dataframe.tail():默认获取后5行,其他行数自行添加
dataframe.info():获取每一列的非空元素个数
3.修改行列索引值:data.index = new_index data.columns = new_columns
注:修改索引值不能单个修改,必须整体修改
4.重设索引:dataframe.reset_index(drop = False)
drop:默认为False,不删除原来索引,True为删除原来索引
5.以某列值设置为新的索引:dataframe.set_index(keys,drop = True)
key:列索引名或者列索引名称的列表
drop:bool值默认为True,当作新的索引,删 除原来列
注:行索引的修改和重设类似列索引
**(5)基本数据操作:**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'
2.结合loc或iloc使用索引:loc:只能指定行列索引名字(先列后行)
iloc:可以通过索引的下标去获取
ix:下标和名称组合做引(老版本)
例:
>>>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>>>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
3.赋值操作:dataframe[‘a’] = b dataframe.a = b
a代表某一列或某一行的名称;b代表某个值
**(6)排序:**1.DataFrame排序:dataframe.sort_values(by = ,ascending =)
单个或多个键排序 by:指定排序参考的键 ascending:默认升序 ascending = False:降序 ascending = True:升序
2.Series排序:值排序:dataframe.sort_values(ascending = True)
索引排序:series.sort_index()
(7)DataFrame运算:
1.元素相加,维度相等时找不到元素默认用fill_value
dataframe.add(dataframe2, fill_value = None, axis = 1)
2.元素相减,维度相等时找不到元素默认用fill_value
dataframe.sub(dataframe2, fill_value = None, axis = 1)
3.元素相除,维度相等时找不到元素默认用fill_value
dataframe.div(dataframe2, fill_value = None, axis = 1)
4.元素相乘,维度相等时找不到元素默认用fill_value
dataframe.mul(dataframe2, fill_value = None, axis = 1)
5.查看日期,输入具体日期,例:
>>>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')
6.逻辑运算:和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 37 84
d 89 94 54 97
>>>c[(c['d1']>50) & (c['d1']<90)].head()
>
a1 b1 c1 d1
c 96 84 37 84
7.逻辑运算函数: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):判断是否有这个值
8.统计运算:dataframe.describe():综合统计包括平均值,最大值,最小值等
9.统计函数:
函数 | 作用 |
---|---|
sum | 获取总和 |
mean | 获取平均值 |
median | 获取中位值 |
min | 获取最小值 |
max | 获取最大值 |
mode | 获取众数 |
abs | 获取绝对值 |
prod | 获取累积 |
std | 获取标准差 |
var | 获取方差 |
idxmax | 获取最大值索引 |
idxmin | 获取最小值索引 |
10.累计统计函数:
函数 | 作用 |
---|---|
cumsum | 计算1/2/3…/n个数的和 |
cummax | 计算1/2/3…/n个数的最大值 |
cummin | 计算1/2/3…/n个数的最小值 |
cumprod | 计算1/2/3…/n个数的积 |
11.自定义运算:apply(func,axis = 0)
func:自定义运算
axis = 0:默认是列,axis = 1为行
**(8)Pandas画图:**1.dataframe.plot(kind = ‘line’)
kind:str,需要绘制图形的种类
图形种类:
种类 | 描述 |
---|---|
line | 折线图 |
bar | 条形图(竖直条状) |
bath | 条形图(水平条状) |
hist | 直方图 |
pie | 饼图 |
scatter | 散点图 |
注:1.条形图中可以添加是否堆积dataframe.plot(kind=‘bar’,stacked=True)
2.stacked为True时堆积,为False时不堆积
例:
>>>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()
(9)文件读取与文件存储:
类 | 数据类型 | 读取文件 | 存储文件 |
---|---|---|---|
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 |
1.read_csv:pd.read_csv(文件路径,sep = ‘,’,usecols = None)
sep:分隔符,默认用’,'隔开
usecols:指定读取的列名,列表形式
2.to_csv:dataframe.to_csv(文件路径,sep=‘,’,columns=None,header=True,
index=True,mode=‘w’,encoding=None
sep:分隔符,默认用’,'隔开 columns:选择需要的列索引
header:是否写进列索引值
index:是否写进行索引值
mode:‘w’:重写,‘a’:追加
4.高级数据处理
(1)判断数据中是否包含NAN:
方法 | 描述 |
---|---|
pd.isnull(dataframe) // dataframe.isnull() | 有缺失值返回True,没有则返回False |
pd.notnull(dataframe) // dataframe.isnull() | 没有缺失值返回True,有则返回False |
**(2)删除存在缺失值的对象:**dataframe.dropna(axis = 0):默认删除缺失值所在行,axis=1 删除列
注:这里不会修改原数据,需要接收返回值
**(3)替换缺失值:**dataframe.fillna(value,inplace = True)
value:替换成的值
inplace:True则会修改原数据,False则不替代修改原数据,生成新的对象
**(4)缺失值有没有使用NAN标记:**dataframe.replace(to_replace = ,value = np.nan)
**(5)数据离散化:**1.为什么要离散化:
连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来 减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
2.什么是数据离散化:
连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散 的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
注:数据离散化要分组和one-hot搭配使用
离散化有很多种方法,这使用一种最简单的方式去操作
人的身高数据: 165,174,160,180,159,163,192,184
最设按照身高分几个区间段: 150-165, 165-180,180-195
这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终 要处理成一个“哑变量”矩阵
3.默认分组:pd.qcut(data,q) 统计分组次数:series.values_cuonts()
注:这里的分组是自动分成差不多数量的类别
对数据列进行分组,一般会与value_counts()(统计分组个数)搭配使用,返回分好组 的数据
data:待分组的数据
q:分成多少组
4.自定义分组:pd.cut(data,bins)
data:待分组的数据
bins:指定分组类型,可以是整型,或列表类型
**(6)One-hot编码(哑变量):**1.把每个类别生成一个布尔列,这些列中只有一列可以为这 个样本取值为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
2.pandas.get_dummies(data,prefix = None)
data:array-like,Series,or DataFrame
prefixs:分组名字
**(7)合并:**1.pd.contact([data1,data2],axis = 1):按照行或列进行合并
2.pd.merge(left,right,how = ‘inner’,on = None)
可以指定按照两组数据的共同键值对合并或者左右各自合并
left:dataframe
right:另一个dataframe
on:指定的共同键
how:按照什么方式连接
3.how的方式:
方式 | 作用 | 描述 |
---|---|---|
left | 左连接 | 左边加左右交集的部分 |
right | 右连接 | 右边加左右交集的部分 |
outer | 外连接 | 并集部分 |
inner | 内连接 | 交集部分 |
**(8)交叉表与透视表:**1.pd.crosstab(value1,value2):交叉表用于计算一列数据对于另外一 列数据的分组个数(用于统计分组频率 的特殊透视表)
2.data.pivot.table()
DataFrame.pivot_table([],index = [])
透视表是将原有的DataFrame的列分别作为行索引和列索引,然后 对指定的列应用聚集函数
**(9)分组与聚合:**1.分组:DataFrame.grouby(key,as_index = True)
key:分组的列数据,可以多个
as_index:若为True则不保留原来的索引,若为False则保留原来 的索引
2.聚合:一般是指对分组中的数据执行某些操作,比如求平均值、最大值 等,并且会得到一个结果集