python依靠numpy和pandas成为数据挖掘的首选语言,就连c++也排名其后,numpy分析数据,pandas处理数据
下面是两个官方文档的链接
numpy
pandas
numpy:
numpy的大致功能有
ndarray 具有矢量运算和复杂传播能力,快速并且节省空间的多维数组
对矩阵进行快速运算和数学函数(已经封装好了,不需要在写循环)
线代,随机数生成,傅立叶变换等等功能
集成c,c++,Fortran,等语言以及运算工具于一体
import numpy as np #np约定俗成
import pandas as pd #pd也是约定俗成
ndarray是一个多维矩阵对象
data = np.arange(6).reshape(2,3) #生成一个2*3矩阵
data*10 #矩阵中的每个元素*10
data + data #矩阵中对应位置的每个元素想家
data.shape #矩阵结构 (2,3)
data.dtype #矩阵中元素数据类型 dtype('int64')
data.ndim #查看第一维的度数
array是一个一维矩阵对象,可以接受一个py内置数组(list),cast为array类型,arange是py内置函数range的数组版
data1 = [i for i in range(5)]
data1 = np.array(data1,dtype=np.float64) #第二个参数可不写,用于指定数据类型
data1 = np.zeros(10) #创建一个十个0元素构成的array
data1 = np.zeros((10,10)) #创建一个10*10的全部都是0元素的矩阵
data1 = np.empty((10,10)) #创建一个10*10的未初始化的矩阵,返回的是垃圾值
data1 = np.arange(10)
ones_like,zeros_like,empty_like根据参数的形状创建全1,全0,全垃圾值的数组
eye,identity 创建一个N*N的矩阵,正对角线为1,其余为0
利用astype进行数据类型转换
arr = np.array([1,2,3,4,5])
float_arr = arr.astype(np.float64) #如果float转换成int,会截断小数部分
like_data = arr.astype(data.dtype) #利用别的数组的数据类型进行转换
numpy内部也有切片操作,numpy内部的切片操作是对原有数组的视图进行操作,也就是说,视图上的任何修改,都会被映射到源数据上,copy()可以进行复制操作
>>>arr = np.arange(10)
>>>arr1 = arr[3:6]
>>>arr1[0] = 1000
>>>arr
array([ 0, 1, 2, 1000, 4, 5, 6, 7, 8, 9])
>>>arr2 = arr[3:6].copy()
>>>arr2[0] = 3
>>>arr2
array([3,4,5])
>>>arr
array([ 0, 1, 2, 1000, 4, 5, 6, 7, 8, 9])
布尔值索引,说不清,直接上代码,自己理解吧
>>>name = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
>>>data = np.randm.randn(7,4) #产生一个7*4的正太分布矩阵
>>>names == 'Bob'
array([ True, False, False, True, False, False, False], dtype=bool)
>>>data[name == 'Bob']
array([[-0.09563111, -0.59702644, 0.51999751, 1.81938195],
[-1.67285045, -2.0938256 , -0.08594732, 1.17717593]])
#输出第0行和第3行
>>>data[name == 'Bob',2:] #布尔索引和切片同时操作
array([[ 0.51999751, 1.81938195],
[-0.08594732, 1.17717593]])
布尔值的不相等 可以用(!=)也可以用(-)进行操作,布尔索引也可以使用算数运算符和(&),或(|)进行运算
>>>mask = (name == 'Bob') | (name == 'Will')
>>>mask
array([ True, False, True, True, True, False, False], dtype=bool)
>>>data[mask]
array([[-0.09563111, -0.59702644, 0.51999751, 1.81938195],
[-0.81575058, 1.27094657, -0.31711804, -2.19019167],
[-1.67285045, -2.0938256 , -0.08594732, 1.17717593],
[ 0.31254292, 0.74331803, -0.39005352, 0.6800547 ]])
花式索引
>>> arr = np.arange(32).reshape((8,4))
>>>arr[[1,5,7,2],[0,3,1,2]]
array([4,23,29,10])
选出来的元素是不是和你预期的不一样,为什么会选出来(1,0),(5,3),(7,1),(2,2),花式索引的行为和预期结果不一样很正常,下面是得到想要结果的一个办法
>>>arr[[1,5,7,2]][:,[0,3,1,2]]
array([[4,7,5,6],
[20,23,21,22],
[28,31,29,30],
[8,11,9,10]])
如果学过linux的管道,那么这个命令很好理解,现提取需要的行,然后行不变,提取需要的列,还有一个办法是使用np.ix_函数,将两个一位整数数组转换成一个用于选取方形区域的选择器
arr[np.ix_([1,5,7,2],[0,3,1,2])]
新的得到的结果和上面的一样,花式索引不会再源数据的视图上操作,会保存到新的矩阵中
arr = np.arange(15).reshape((3,5))
np.dot(arr.T,arr) #计算两个矩阵的内积x.T*x
矩阵的转置可以直接利用DataFrame.T进行转置,对于高维度数组转制,也可以利用transpose例如下面
>>>arr = np.arange(16).randn((2,2,4))
>>>arr.transpose((1,0,2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
是不是没看懂怎么转的,很简单,原来矩阵下标为0,1,2,现在要转成1,0,2,那就可以看作第三维不变,只转第1和第2维的矩阵,也就是说第三维矩阵可以看作一个大块儿不变,然后按照二维进行转制
有人会问,那么1,2,0怎么转,牛逼的人可以一下转出来。笨一点的话,先把0,1,2转成1,0,2,也就是第三维不变,然后1,0,2转成1,2,0,第一维不变,两步转置,熟练的话,一步就可以转出来。或者利用swapaxes方法,传入需要转的维度参数,直接进行这两个维度的转置,不牵扯其他维度。
将条件逻辑表述为算数运算,利用where循环处理数据时,一共三个参数,第一个参数为真就返回第二个参数,否则返回第三个参数
>>>xarr = np.array([1.1,1.2,1.3,1.4,1.5])
>>>yarr = np.array([2.1,2.2,2.3,2.4,2.5])
>>>cond = np.array([True,False,True,True,False])
>>>result = np.where(cond,xarr,yarr)
>>>result
array([1.1,2.2,1.3,1.4,2.5])
也可以对上的某个数组或者轴向进行统计计算,比如sum,mean,std等聚合计算。mean,sum这类函数一般都可以接受一个axis参数,用于对矩阵轴向的统计,1横0竖。
布尔值会被强制转换成0和1,所以sum经常用在布尔数组中True值的个数
>>>arr = np.random.randn(100)
>>>(arr > 0).sum()
44
布尔数组中,any用于测试数组中是否存在一个或多个True,all检查数组中是否全是True,返回True或False
sort可以对数组进行排序,同样可以接受axis,选择对横竖轴进行排序,也可以选择某一个轴对其进行排序
unique用于数组去重并且排序,py内置函数set同样可以去重,但是对返回值不进行排序,可以利用sorted进行排序,但是效率会很低
np.save可以将二进制文件写入磁盘中,接受的第一个参数是文件名,可以不加后缀,默认保存在后缀为.npy的文件中,第二个参数是要保存的数组名。
np.load读取npy文件中的内容,然后赋值给数组。
np.savez将多个数组保存在一个压缩文件中,一般后缀为npz,读取这类文件时,会得到一个类似字典的对象。
读取csv文件,利用np.read_csv,读取文本文件利用np.loadtxt,loadtxt可以传入参数delimiter选择数据分隔符
矩阵乘法可以利用dot函数,np.dot(x,y) 和x.dot(y)是相等的,inv是矩阵的逆矩阵,qr对矩阵进行分解,分解为正交矩阵和上三角矩阵,返回两个参数
大概numpy就是这么多了吧
想了解更多更具体的numpy建议去看官方文档
下面是pandas库
pandas库有两个主要的数据结构,相当重要相当重要相当重要:Series,DataFrame
Series类似于一维数组的对象,由数据和相关的数据标签组成,也就是通常人说的索引。
>>>obj = pd.Series([4,7,-5,3])
>>>obj
0 4
1 7
2 -5
3 4
>>>obj.values
array([4,7,-5,3])
>>>obj.index
Int64Index([0,1,2,3])
也可以对Series指定索引
>>>obj2 = od.Series([4,7,-5,3],index=['d','b','a','c'])
>>>obj2
d 4
b 7
a -5
c 3
可以通过索引的方式选取Series中一个或者一组值,也可以将dict强制类型转换为Series,转换之后dict的key就是index,values就是Series的value,Series的索引可以通过Series.index的方式进行赋值修改
对于数据中的NAN,可以用isnull和notnull来进行检测,返回值为True或False
两个Series相加时,会自动对其index的属性,然后将其value相加
DataFrame是一个表格型数据结构
在操作DataFrame时,对其索引方式返回的列的数据如果进行修改,那么修改的是视图,修改的数据会直接映射到源数据上,可以通过copy的方式对其进行显示的赋值操作
映射出来的索引是不可进行修改的
>>>obj = pd.Series(range(3),index=['a','b','c'])
>>>index = obj.index
>>>index
Index([a,b,c],dtype=object)
>>>index[1:]
Index([b,c],dtype=object)
>>>index[1] = 'd'
Exception :
object is immutable
但是如果需要重新定义DataFrame的索引,可以利用reindex对其进行重新重排,如果索引不存在,就会引入缺失值NAN,如果不想引入缺失值,传入参数fill_value就可以指定NAN的值,也可以利用method选择插值选项,对其进行插值处理。
如果直接传入参数columns,会对行的索引进行排列,同样,不存在的值可以传入参数进行指定或者选择插值处理。在进行reindex的时候可以同时传入inde和columns指定行标和列标
如果有需要删除的数据,利用drop可以将其删除。不指定参数的话,删除的是索引值指向的数据,指定参数axis选择删除行还是列,1横0竖
在DataFrame相加的时候同样也会产生NAN的情况,可以调用add方法,然后传入fill_value指定NAN的处理方式
>>>df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=list('abcd'))
>>>df2 = pd.DataFrame(np.arange(20).reshape((4,5)),columns=list('abcde'))
>>>df1.add(df2,fill_value=0)
a b c d e
0 0 2 4 6 4
1 9 11 13 15 19
2 18 20 22 24 14
3 15 16 17 18 19
在指定索引的时候,也可以指定一个填充值,fill_value指定填充值为多少
需要注意的是pandas高版本进行过一些库的迁移,比如pandas.io.data被迁移到pandas_datareader.data中,yahoo将数据关掉之后,想调取yahoo的数据的话,需要先pip3 install fix_yahoo_finance之后倒入这个库,最后一步yf.pdr_override()就可以将其数据安全完整的传输到本地
利用DataFrame.corr返回相关系数,cov返回数据的协方差矩阵。
corrwith返回一个列和另一个Series之间的相关系数
处理DataFrame的缺失数据时,存在一个操作是过滤缺失数据,利用dropna就可以,传入参数how选择删除所有为NAN的行,还是重要存在NAN就删除
>>>data = pd.Series([1,NA,3.5,NA,7])
>>>data.dropna()
0 1
2 3.5
4 7.0
>>>data = DataFrame([1,6.5,3],[1,NAN,NAN,NAN],[NAN,NAN,NAN],[NAN,6.5,3])
>>>data.dropna(how='all') #传入all,指定全部为NAN才会被删除
0 1 2
0 1 6.5 3
1 1 NAN NAN
3 NAN 6.5 3
同样在进行Drop是也可以指定axis删除行与列,如果不想删除,可以通过fillna来填补缺失数据,指定inplace为True的话,可以指定为修改视图
暂时就写这么多吧,numpy和panda是数据挖掘的前缀课程,数据挖掘是机器学习的前缀课程,所以这两个库就当是打基础了。
官方文档永远都可以把库介绍的很具体很清晰,并且非常严谨,建议拿官方文档入手