【日有精进】今天认真学python了吗

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对应的数据
View Code

【注】我刚要读取放在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参数的正负都很灵活,适用于日期计数

 23.7.10 

SyntaxError: Non-ASCII character '\xe5' in file xxxxx.py on line xxx, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
fix: 文件第一行插入如下代码解决

# -*- coding: UTF-8 -*-

 

---------

posted on 2021-03-20 12:52  Mju_halcyon  阅读(150)  评论(0编辑  收藏  举报

导航