数据挖掘 numpy,pandas库详解

        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 : <class 'pandas.core.index.Index'> 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是数据挖掘的前缀课程,数据挖掘是机器学习的前缀课程,所以这两个库就当是打基础了。

官方文档永远都可以把库介绍的很具体很清晰,并且非常严谨,建议拿官方文档入手

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容