关于这本书
这本书第一章是讲安装和配置的一些问题,第二章是引言,主要是让人感受一下数据分析的乐趣(乐趣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作用就是在一个数组内,遍历所有元素,将元素出现的次数记下来。下面是我测试的代码:
用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)为数据生成一张图片:
'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
网友评论