• 【日有精进】今天认真学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参数的正负都很灵活,适用于日期计数

    ---------

    用代码改变世界!就是这样,喵!
  • 相关阅读:
    词义辨析:事件与事故
    术语-BPM:BPM
    职位:DBA
    职业-软件:软件测试工程师
    职位-软件工程师:软件工程师
    职业-IT:全栈工程师
    术语-技术栈:技术栈
    .NET Core:目录
    .NET Core:.Net Core 百科
    术语-抽象:抽象
  • 原文地址:https://www.cnblogs.com/Song-Meow/p/14560469.html
Copyright © 2020-2023  润新知