这是书籍《Pandas Cookbook》书籍第03章的代码复现,所有代码运行在Jupyter Notebook上,原讲解地址是:
https://www.jianshu.com/p/05cb76788c80
我上传代码的github地址是:
https://github.com/Asunqingwen/PandasCookbook.git
github上有该书中用到的data,里面代码会不定期更新(因为工作原因,时间不定),直到本书学习完成!
相比原讲解,会穿插一些自己的理解,水平有限,请各路大神指正。
1.规划数据分析路线
这一部分主要是用describe()结合它的include参数,显示导入数据的一些基本信息,显示所用的函数不是常用的print(),而是IPython库的display()
import pandas as pd
import numpy as np
from IPython.display import display
pd.options.display.max_columns = 50
2.改变数据类型,降低内存消耗
这段主要用到了一个函数——memory_usage(deep=True),用来计算导入数据所占的内存,而如果某个column的数据类型可以修改为占内存更小的数据类型,那就能进一步降低内存消耗
#选取五列
college = pd.read_csv('data/college.csv')
different_cols = ['RELAFFIL','SATMTMID','CURROPER','INSTNM','STABBR']
col2 = college.loc[:,different_cols]
col2.head()
#查看数据类型
col2.dtypes
# 用memory_usage方法查看每列的内存消耗
original_mem = col2.memory_usage(deep=True)
original_mem
我们可以通过astype()对column的数据类型进行转换,当然不能随便转换,要先确定是否占内存更小的数据类型可以表示其整列值——比如RELAFFIL原来是int64,但是它整列值都是0/1,所以完全可以用int8来表示;再看STABBR,是object类型,但是它的值只有59个是不同的,那么就可以用category来表示,category类似于tensorflow的one_hot编码,在这里就相当于将STABBR59分类了,这样就比原来少占很多内存了。category的具体讲解,可以看下面这篇博客 https://blog.csdn.net/FrankieHello/article/details/81220116
修改完数据类型后内存占比
pandas中规定,只要数值类型列,有缺失值,那么这一列的数据类型就是浮点型,所以不能强制转换为整型,不然会报错——ValueError: Cannot convert non-finite values (NA or inf) to integer
3.从最大中选择最小
这段用到了两个函数nlargest(n,column_name)和nsmallest(n,column_name),顾名思义,主要是获取导入数据某一列值最大的前n个,某一列值最小的前n个,不需要排序
4.通过排序选取每组的最大值
这段主要用了两函数sort_values(columns_name,ascending)和drop_duplicates(columns_name),
sort_values主要用来排序,第一个参数是要排序的列名,如果有多列,需要传入list类型,依次排序每一列;而第二个参数是决定使用降序还是升序的bool变量;
drop_duplicates()用来去除,第一个参数的含义和sort_values一样。
5.用sort_values复现nlargest方法
nlargest(n,)函数就是选取最大的前n个,而通过sort_values()降序排列,再通过head(n),我们能达到和nlargest()函数一样的效果,但是可能选取的rows会有差异,因为最大值个数如果大于n的话,head(n)和nlargest(n)选取出来n个可能会有差别了,因为如何选择n个的机制不一样
6.计算跟踪止损价格
这里用到了一个新module——pandas_datareader
这个module是用来远程获取金融数据的,主要是从yahoo获取(用google的源没有获取成功),用DataReader(公司,数据源,开始时间),对应的官方文档
https://pandas-datareader.readthedocs.io/en/latest/
import pandas_datareader as pdr
#查询特斯拉在2017年第一天的股价
tsla = pdr.DataReader('tsla',data_source='yahoo',start='2017-1-1')
tsla.head(8)
#只关注每天的收盘价,使用cummax得到迄今为止的收盘价最大值
tsla_close = tsla['Close']
tsla_cummax = tsla_close.cummax()
tsla_cummax.head(8)
#将下行区间限制到10%,将tsla_cummax乘以0.9
tsla_trailing_stop = tsla_cummax * .9
tsla_trailing_stop.head(8)
#将上述功能包装成一个函数
def set_trailing_loss(symbol,purchase_date,perc):
close = pdr.DataReader(symbol,'yahoo',start=purchase_date)['Close']
return close.cummax() * perc
tsla_close = set_trailing_loss('tsla','2017-6-2',.18)
tsla_cummax = tsla_close.cummax()
tsla_cummax.head(8)