这是书籍《Pandas Cookbook》书籍第05章的代码复现,所有代码运行在Jupyter Notebook上,原讲解地址是:
https://www.jianshu.com/p/d67080f59b06
我上传代码的github地址是:
https://github.com/Asunqingwen/PandasCookbook.git
github上有该书中用到的data,里面代码会不定期更新(因为工作原因,时间不定),直到本书学习完成!
相比原讲解,会穿插一些自己的理解,水平有限,请各路大神指正。
文章目录
- 1.计算BOOL值统计信息
- 2.构建多个BOOL条件
- 3.用BOOL索引过滤
- 4.用标签索引代替BOOL索引
- 5.用唯一和有序索引选取
- 6.观察股价
- 7.翻译SQL的WHERE语句
- 8.确定股票收益的正态值
- 9.使用查询方法提高BOOL索引的可读性
- 10.用where方法保留Series
- 11.对DataFrame的行做mask
- 12.使用BOOL值、整数、标签进行提取
1.计算BOOL值统计信息
这段主要是先通过比较运算,将DataFrame和Series内的元素转为BOOL类型,然后再进行响应的运算,得注意一下value_counts(normalize=True)这个函数,本来是统计个数的,加上normalize参数后,就变为统计频率了,之前第01章也有用到
2.构建多个BOOL条件
这段主要是多个条件比较,对应多个基于BOOL变量的数据结构,而多个BOOL条件也可以用位运算符组合
3.用BOOL索引过滤
结合BOOL条件,DataFrame之类的数据结构可以进行过滤,将符合BOOL条件的数据过滤出来
4.用标签索引代替BOOL索引
这段先是设置索引,然后通过loc来对相应的索引进行选择,对比运行时间,虽然设置索引会很费时间,但是索引只用设置一次,后面用loc来操作就快了
5.用唯一和有序索引选取
对比四种索引方式的运行时间——BOOL索引、无序行索引、有序行索引、唯一行索引,如果不算前期处理操作,四种索引方式的消耗时间依次减少
6.观察股价
用了matplotlib中的plot()和hlines()函数——先用plot()将所有的收盘价在坐标轴中用黑色曲线绘制,然后用plot()单独将收盘价最高和最低的10%部分用灰色绘制,最后通过hlines()绘制水平直线,区分最高和最低的%10同其他区域
这里不同于上面用曲线颜色来区分,主要是区域填充不同颜色来区分——fill_between()可以在指定区域内用不同的颜色来区分,先将所以区域用黑色填充,然后将最高和最低的10%区域用灰色填充
7.翻译SQL的WHERE语句
这段没啥特殊,主要是看下导入数据的基本信息,有一个地方需要注意的是:列名也可以作为导入数据的属性,调用对应的属性名,可以获取对应列数据
主要是解释下sql语句——先从EMPLOYEE表中选取薪水80000-120000的人住的DEPARTMENT(这里应该还少了WHERE条件,即过滤出80000-120000的人),然后将DEPARTMENT分组,并降序排列,选出前5条数据;之后将这5条数据的DEPARTMENT属性提取出来,然后从EMPLOYEE表中选取不属于这5个DEPARTMENT的数据
8.确定股票收益的正态值
这里主要涉及到了pct_change()函数——计算当前元素与先前元素相差的百分比,axis参数可以调整按行还是按列计算
经过z-score处理后,数据其实进行了标准化,使得数据整体分布符合标准正态分布
9.使用查询方法提高BOOL索引的可读性
查询语句逻辑上有点类似于人脑的查询逻辑,都是很直白的表述,只是如果要用到变量,就需要@符号来获取变量的值
10.用where方法保留Series
当我们用BOOL条件作为索引时,如果是[]运算符索引,索引出的数据会去掉符合False条件的数据,size可能比原数据小;如果用where()函数索引,索引除的数据会将符合False条件的数据用缺失值NaN代替,size和原数据一样大,如果不想用NaN代替,可以设置other参数,用指定的数据代替
clip()函数效果等同于上面BOOL条件索引和where()的结合
11.对DataFrame的行做mask
mask()函数会得到BOOL条件中符合False的结果,注意看BOOL条件,以及输出结果中title_year的数值
通过BOOL条件,选出和mask一样的结果,但是两者结果不等,shape一样,因为mask方法会产生许多缺失值NaN,而NaN是不等于本身的,且数值类型的NaN统一变为浮点型
利用pandas对象专有比较函数,就能判断mask和BOOL条件得出的两个对象是相等的
通过运行时间对比,利用BOOL条件索引的速度远远快于利用mask()函数的索引速度
12.使用BOOL值、整数、标签进行提取