美文网首页
《利用Python进行数据分析》学习笔记——第二章(1)

《利用Python进行数据分析》学习笔记——第二章(1)

作者: 半颗卷心菜 | 来源:发表于2018-11-24 23:19 被阅读0次
    利用Python进行数据分析

    关于这本书

            这本书第一章是讲安装和配置的一些问题,第二章是引言,主要是让人感受一下数据分析的乐趣(乐趣emmm.......),如果是纯小白开始学的话应该是从第三章开始。

    言规正传!

            那我是从本书的第二章开始的,因为第一章要安装和配置的东西,我其实很早以前就有完成了,就不再回头重新做了,如果有问题的话可以问我。

            那我这里用的开发环境是Pycharm,部署的是Anaconda的Python环境,这样的话很多库就不需要自己安装了。

            另外呢,如果拿到这本书发现没有数据可以进行操作的呢,可以到下面这个地址去下载:https://pan.baidu.com/s/18tFgcWDwSGtCMPeI0s2ubw

    来自bit.ly的1.usa.gov数据

    图2.1 读取文件的第一行

            path后的这一串字符是要读取的文件的路径,要读取的文件和写的代码在一个文件夹的话就不需要写路径了,就用一个文件名就可以了(一定要记得加后缀,不然会报错)。readline()的作用就是逐行读取的意思。(readlines读取所有行,返回并返回列表。而这两者的共同点都是返回字符串)

            这里就可以看到他输出的是一个字符串,那么我们用Python内置的模块将JSON字符串转换成Python字典对象的话可以更方便我们进行索引:

    图2.2 将JSON字符串转换成Python字典对象

            那么从输出的格式就可以很清楚的看出二者的区别了。

            假如我们要查看这个字典里的时区‘tz':

    图2.3 查找时区

    用纯Python代码对时区进行计数

    图2.4 KeyError

    加上if判断:

    图2.5 取出前10个时区

    对时区计数:

    图2.6 计数方法一

            这里我一开始是碰到了一点问题,我就一直在想counts一开始明明是个空的,为什么可以对它加减。后来想清楚之后发现自己的基础确实不够扎实。其实很简单,for循环每次从sequence中取出一个字符串做为counts中的Key进行判断,如果counts中有这个Key的话(if x in counts)就+1,没有这个Key的话(else)就赋给它,并且value为1。那其实就很清楚counts中的Key其实都是在else这一段中赋予的。

            那么另一种方法:

    图2.7 计数方法二

            这里的defaultdict意思就是给我这个“字典”里没有的Key,value全部初始化为0(哈哈,没有的key、初始化为0,什么鬼),下面是我自己测试的一行代码:

    图2.8 测试defaultdict

            从里面可以看到我一开始创建字典对象的时候,是没有赋值的,但是我用'a',1,'b'进行索引的时候会返回0这个默认值,当然把int换成其他的type,默认值是不一样的。

            分别调用让述两种计数方法:

    图2.9 分别调用两种计数方法

    得到前10位的时区及其计数值:

    图2.10 得到前10位的时区及其计数值

            sort默认是升序,所以返回的value_key_pairs是从-n开始,也可用降序,sort加个参数就好了:

    图2.11 降序输出前10

    用collections.Counter类对计数、得到前10位的时区及其计数值进行优化:

    图2.12 用Counter函数进行计数并输出


            Counter作用就是在一个数组内,遍历所有元素,将元素出现的次数记下来。下面是我测试的代码:

    图2.13 测试Counter

    用pandas对时区进行计数

    图2.14 创建DataFrame

            这个DataFrame的话就类似于excel的表格,索引方式类似于字典,当然还是有区别。如果有小伙伴看到这里想具体学习一下pandas,或对pandas迷迷糊糊的话可以点这里:pandas_vs_excel,放到excel里面就相对好理解了(里面有个发言的叫Bange_dislike_CST就是我,嘿嘿),我就是刚刚在那里学完。

    输出‘tz'前10位:

    图2.15  输出

            那这里的’tz'就是一个序列,简单讲就是DataFrame的一个列,下面是我测试的一串代码,简单理解一下:

    图2.16 Series和DataFrame

    对Series对象进行排序并输出:

    图2.17 对Series对象进行排序并输出

    对缺失值和未知值进行替换

    图2.18 对缺失值与未知值进行替换

            fillna的作用是将序列中的值为NAN(not a number)的值填充为‘Missing’,而clean_tz[clean_tz=='']='Unknown'的话,我用了一行代码大概可以解释一下:

    图2.19 代码测试布尔数组运算

            其中运行第三行返回的是series4==' '(series4中值为' ')的下标,然后将布尔值为True的元素赋值为‘Unknown’。

    利用绘图库(matplotlib)为数据生成一张图片:


    图2.20 1.usa.gov示例数据中最常出现的时区

            'barh'代表类型(kind)是横向柱状图,rot代表轴刻标旋转角度(rotation)是0度,所以这里不加应该也没关系。‘bar'就是纵向柱状图:

    图2.21 纵向柱状图

            感觉这里书上好像不太对,书上说是用matplotlib的绘图库,不过这里用的好像是pandas自带的,都没有导入matplotlib库。

    分离字符串信息:

    图2.22 分离数据

            这里的frame.a.dropna指的是将表frame中的'a'这一列缺失的数据(NAN)进行过滤(dropna),然后取剩下的序列。而split函数若是没有添加参数进去,默认以' '为间隔进行分割,并返回list。至于为什么会输出这样的的结果,我就不详细写了(我也不确定会不会有人看到这里,有人问我再改吧),这里贴个我自己看的懂的代码先:

    图2.23 frame['a'][0].split()

    计数:

    图2.24 计数信息

    移除缺失数据:

    图2.25 移除缺失数据

            这里的notnull感觉和dropna类似,不过notnull应该是过滤值为空(‘ ’)元素,dropna过滤的是NAN

    根据a值计算出各行是否是Windows:

    图2.26 计算出各行是否是Windows

            一开始我还不知道里面的这人str是做什么的,还以为是用来将序列字符串化(不过一听就很奇怪),后来查了一下才知道是pandas库里的一个内置方法(srt应该是不能直接单独用,后面要跟一个函数,就像上面的contains,不过这里我也不是很确定),要详细了解的百度一下“Python Series.str”就可以了。

            那第一行就可以理解为:帮我找一下哪个序列中哪个元素的字符串中包含有'Window',有的话就返回一个‘Windows'到新的array的相同位置,没有的话就返回一个'Not Windows'到新折array的相同位置。换一个代码理解一下:

    图2.27 测试代码

            看序列中哪个元素的字符串中包含有'abc',有返回'0',没有返回'1'

            根据时区和新得到的操作系统列表进行分组,然后能过size对分组结果进行计数,并利用unstack(不要堆叠)对计数结果进行重塑:

    图2.28 分组计数

            其实我对groupby的理解有模糊,不知道怎么描述,所以我在这里就不多说了,贴一张别人的图和自己写的测试代码:

    图2.29 分组、聚合 图2.30 测试代码

    选取最常出现的时区:

    图2.31 最常出现的时区

            这里面sum(1),这个1是个参数,默认为0表示按列相加,1表示按行相加,测试代码:

    图2.32 sum()测试代码

            argsort()将序列中的value从小到大排列,提取其对应的index(索引)(例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5),然后以序列的形式输出,测试代码:

    图2.33 argsort()测试代码

            其实到这里,书上输出的结果,就有点让人懵B了,所以我再写一段代码和图2.31进行对照理解:

    图2.34 代码测试

            其中3,2,1,0就是gr_counts横向相加之后做升序(从小到大)排序后的索引。

    通过take按照间接索引数组的顺序排列,并提取最后10行(最大的10行):

    图2.35 提取出的最大的10行数据

            take的索引的作用可以用下面这串代码解释:

    图2.36 take测试

            由于list不能直接用take,所以我这里换了一种形式,这里的list就相当于书中代码的agg_counts,再通俗一点的话:

    图2.37 按索引顺序排列

    生成堆积条形图:

    图2.38 生成的堆积条形图

            将各行规范化为”总计为1“,并重新绘图:

    图2.39 比例图

            文中的意思应该就是生成各项的比例图,那么div在这里的作用就是作除法,运行的规则我用一串代码来表示一下:

    图2.40 div测试

            从中可以看到t的数据是每个元素除以对应行的元素之和(data1.sum(1)),axis=0表示按行索引匹配并且在列上进行计算。

    结束

            这一篇快要写的时候,翻了一下书的后面,发现好多方法在后面都有比较详细的讲解和例子(废话),所以我还是太年轻了,为什么不先把书浏览一遍再开始。。。要是有和我一样单纯的小伙伴刚刚看到这里,可以考虑换下顺序进行。不过我下一篇应该还是会接着这里往后面推进,可能这样对于我来说可以记得更深刻,对于后面的学习可以更加轻松。

            所以这算是总分总的学习方法吗。。。哈哈

    感受

            第一次自己主动写东西,还有三千多字,还颇有几分感慨

            这些代码我在前一天就全部看完和跟着写完了,大概花了我2个小时,其中不懂的当时也百度了,本来以为都会了,想着今天写一篇应该花不了多长时间,结果还是用了将近10个小时。所以我发现了很多问题:有些函数的方法我前一天查过的,但是今天回头再看过去的时候,发现我对于它的使用方法基本没什么印象,唯一记得的就是我前一天查过。。。另外,有些语句我当时认为看懂了的,或者是当时查完之后认为弄懂了的问题,其实根本就是一知半解,要写出来或者要我讲给别人听的话,完全讲不出所以然。。。还有就是,在写一些测试、用来加深理解的代码的时候,可以深刻的感受到看的懂和会写,完全就是天差地别。

            好吧,至少这些时间没有白花,也算是对我前面一段时间学习的检测,还是给自己个及格分吧,emmmmm。。。。

    完成于2018年11月24,23:18。

    最后一下修改于2018年11月25,19:53

    相关文章

      网友评论

          本文标题:《利用Python进行数据分析》学习笔记——第二章(1)

          本文链接:https://www.haomeiwen.com/subject/boivfqtx.html