3.20 保存和读取pickle文件
- 何为pickle:pickle是一种python对象文件,可以将多个任何类型的python数据打包放到一个pickle文件中。优点是方便快速访问,且对不同机器兼容。
- 操作pickle文件:需要import pickle库,一般使用pickle.dump()保存,pickle.load()读取。今天处理了一个含有dataframe的pickle文件,以下是读取代码。
import pickle import pandas as pd def load_obj(name): if ".pkl" not in name: name += ".pkl" with open(name, "rb") as f: return pickle.load(f) if __name__ == "__main__": f = load_obj("pickle文件名.pkl") keys = list(f.keys()) #先保存pickle文件的键名,f.keys()的内容为dict_keys([key1,key2,...]),此处转换为列表保存到keys中 print(f[keys[-1]]) #查看最后一个key对应的数据
【注】我刚要读取放在pickle里的dataframe时,遇到报错'Dataframe' object has no attribute '_data'。面向Stack Overflow编程后发现,根据网友BodoB的说法,可能是pandas库版本过低。"pip list"往cmd命令行里一敲,果然,pandas居然还停留在0.9.0版本。接下来就是传统的"pip help"-查看卸载命令、"pip uninstall pandas"、"pip install pandas"。再一看,哦豁,居然升级到1.1.5版本了,现在可以正常读取pickle里的dataframe格式数据了。
3.27 包含sequence、dataframe等的复杂.mat文件处理
- 用loadmat()读取.mat文件:返回类型暂时不清楚(应该和保存时有关吧),如果是dataframe,则照旧先看.keys()都包含什么,一般前几个键名都相同,之后可以自行添加:
- dict_keys(['__header__', '__version__', '__globals__', 'xxx', 'yyy', 'zzz'])
-
ndarray的dtype属性:numpy库的数据类型ndarray有很多属性(如T, data, dtype, flags, flat, imag, real, size等),其中一个关键属性是dtype。对一个ndarray对象A,可以运行print(A.dtype.names)查看都有什么自定义数据变量类型,.dtype.names返回值为一个字符串元组。假设存在变量"example1",则进而可以通过A["exampple1"]访问该变量下的值
- 顺便吐槽一下matlab的序列化时间格式(不过matlab一共有三种时间格式,其他两种还挺友好的)真是反人类,可读性不行,最大的用处可能是计算两个日期之间相差的天数。而且貌似只有matlab有现成的函数可以转化这种格式。长了个教训,类似72xxxx、73xxxx的数字,就有可能是matlab时间格式T_T
3.29 pandas 的Series和DataFrame排序
- 排序函数主要包括.sort_index(), .sort_values()以及专门计算排名的.rank(),前两种可以通过设置参数inplace=True(默认为False,排序后返回新拷贝)直接改变原对象。以下主要介绍.rank()函数
- rank函数真的很妙,很方便计算非正态分布数据的排名,以便计算spearman correlation
- 参数顺序与默认取值:rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
- axis参数(指定对列/行排名):0(按每列内排序),1(按每行内排序)
- method参数(指定排名方法)
- average(在某一个值上,若存在多条数据,则该多条数据排名取相同值,取样本中相邻的两个排名均值)
- first(在某一个值上,若存在多条数据,则该多条数据排名不同,按出现在样本中的先后顺序排名)
- max(在某一个值上,若存在多条数据,则该多条数据排名取相同值,取这些数据在样本中排名的最大值)
- min(在某一个值上,若存在多条数据,则该多条数据排名取相同值,取这些数据在样本中排名的最小值)
- dense(与min类似,但每组相同数据的排名在组与组之间会间隔1)
- numeric_only参数(指定排序对象类型,可选参数):True(仅对数值型数据排序)或None
- ascending参数(指定升降序):True(按升序由小到大),False(按降序由大到小)
- na_option(指定Nan值的排名方式)
- pct(是否计算数据的百分比排名)
4.2 对dataframe直接切片索引
- 假设df是pandas.DataFrame类型的数据,k是整数下标,注意df[k]会索引为列名为k的那一列,如果列名columns中没有k,则直接报错KeyError
- 要得到DataFrame格式的切片,则索引df[ [col_name1, col_name2, ... ] ],即在中括号里加需要提取的列的列名
- 特别地,如果要取连续的多列,可以先将列名转换为连续的整数(例如0, 1, 2, ... , k),再索引df[ [i for i in range(k+1) ] ]即可
4.6 pandas索引返回视图或拷贝
这个点比较可怕……
- 对pandas的数据类型进行不同方式的索引,返回值为copy(拷贝)或view(视图)
- 对拷贝数据修改不会改变原数据,对视图数据修改会改变原数据,某些情况会引发警告
- 避免对pandas.DataFrame进行链式的下标索引,这种行为会被python解释器分解为多步进行索引,返回拷贝或视图不确定(是否另外复制数据由数据切片的大小、机器内存多少决定)
- 应使用.loc函数一次索引多级目录,因为.loc函数能保证返回值为拷贝(当然若.loc的参数含有下标,则返回拷贝或视图也不确定)
- 另外,numpy中的数组切片是视图,需要显示.copy才能创建拷贝
参考资料:pandas官方文档对返回值类型的解释、lyyolo的博客python--NumPy/Pandas 数据赋值时的视图和副本问题
- 对dataframe数据用 corrwith函数计算相关性更好,对ndarray数据直接用corr函数
https://vimsky.com/examples/usage/python-pandas-dataframe-corrwith.html
【待补充】python的@装饰器用法与私有函数
5.26 dateutil.relativedelta函数与datetime库的配合使用
import datetime from dateutil.relativedelta import relativedelta if __name__ == '__main__': print(datetime.date.today() - relativedelta(years = 20, months=7,days =17)) #中间的加减号,和relativedelta参数的正负都很灵活,适用于日期计数
---------