python(学习记录)

一、机器学习基本使用工具

常用的工具有如下几个

工具作用
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 文件读取与文件存储

数据类型读取文件存储文件
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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值