zoukankan      html  css  js  c++  java
  • 使用pandas的部分问题汇总

    pandas(我所用版本0.17)是一个强大数据处理库,在开发金融类系统中我应用到了pandas.Dataframe数据类型,它的数据结构类似一张图表(如下图所示),左边一列为index既行的索引:

                 图1

    下面主要介绍在开发中使用方法:

    1,DataFrame将1分钟K线数据合成5分钟数据

    pd_1m = pd.DataFrame() #已有1分钟K线数据
    #合成新K线的前提是df的数据的index必须是时间
    pd_1m = pd_1m.set_index('kline_time') #将时间戳设置为index
    #设置df数据中每列的规则
    ohlc_rule = {
        'open': 'first',#open列:序列中第一个的值
        'high': 'max',#high列:序列中最大的值
        'low': 'min',#low列:序列中最小的值
        'close': 'last',#close列:序列中最后一个的值
        'volume': 'sum',#volume列:将所有序列里的volume值作和
        'amount': 'sum'#amount列:将所有序列里的amount值作和
    }
    #合成5分钟K线并删除为空的行 参数 closed:left类似向上取值既 09:30的k线数据是包含09:30-09:35之间的数据
    pd_5m = pd_1m.resample('5min', how=ohlc_rule, closed='left', label='left').dropna(axis=0, how='any')
    #dropna(axis=0, how='any') axis参数0:针对行进行操作 1:针对列进行操作  how参数any:只要包含就删除 all:全是为NaN才删除

    2,DataFrame的行遍历及过滤

    import pandas as pd
    import numpy as np
    
    
    dates = pd.date_range('2020-01-01',periods=6)
    df = pd.DataFrame(np.random.rand(6,4),index=dates,columns=['a','b','c','d'])
    
    # iloc根据行号来取值
    print(df.iloc[3]) # 第三行
    print(df.iloc[1:4]) # 左闭右开
    # loc根据行头来取值 此数据行头是日期
    print(df.loc["2020-01"]) # 行头包含2020-01字符串的所有行
    print(df.loc["2020-01-02": "2020-01-04",["b","c"]]) # 行头再这个范围内 可指定显示某几列
    # 根据列来筛选
    print(df["a"]) # 获取单列
    print(df[["a","b"]]) # 获取多列
    # 以下根据条件筛选也可用于loc函数中
    print(df[df['a']>0]) # a列数据大于0的行筛选出来
    print(df[~df['a'].isin([2,3,5])]) # ~表示不满足该条件的其他数据 isin表示在某个list中
    print(df[(df['a'].isin([2, 3])) & (df['b'] != 0)]) # &与;|表示或 ;运算符:!=不等于 == > < 以此类推等等
    # df行遍历
    for index,row in enumerate(df.iterrows()):
        # row既每行,包含行头及行数据
        print(index,row[0],row[1])

    3,pandas中转化数据及变更类型

    import pandas as pd
    import numpy as np
    
    # 整理,格式化数据
    dates = pd.date_range('2020-01-01',periods=6)
    df = pd.DataFrame(np.random.rand(6,4),index=dates,columns=['a','b','c','d'])
    df["e"] = pd.Series([1,1,3,4,4,2],index=dates)
    
    # apply根据用户执行axis来计算得到新行/列数据 1=列 默认行0
    f_col = df.apply(lambda k: k['a']*k['b'] if k['c'] >0.5 else k['a']*k['c'], axis=1)
    
    # map是Series的函数通过mapping来生成新的数据行/列 可以使用dict,也可函数
    print(df["e"].map({1: 9}))
    print(df["e"].map(lambda x: 0 if x > 3 else 1))
    
    # applymap 处理全部的行业数据
    def cal_custom(data):
        return float("%.2f" % data)
    print(df.applymap(cal_custom))
    
    # 在统计分析中会用到变量类型装换 需要转为分类型变量
    z = pd.Series([3,4,6,6,4])
    z = z.astype("category") # 分类型变量(分类型变量本身可以是数字格式)
    # 转换为数字类型
    pd.to_numeric(z, errors='coerce') # ignore
    # 指定分类型变量为指定顺序的有序分类型变量
    print(z.cat.reorder_categories([4,6,3]))

    # pandas中pandas.tslib.Timestamp的计算及转换
    dtime = pandas.tslib.Timestamp() dtime = dtime + np.timedelta64(8, 'h')#给时间加上8小时 np为numpy 参数 h 小时 m 分钟 dtime = dtime.strftime('%Y-%m-%d %H:%M:%S')#转换为字符格式

    4,其他

    print(df.cov()) # 协方差矩阵
    print(df.corr()) # 相关系数矩阵
    print(df.corrwith(df["a"])) # 某列与其他列的相关系数结果
    print(df.groupby(["a","b"]).agg(['mean','std','count','max','sum'])) # std标准差

     以上主要为开发问题中遇到的场景,有局限性,希望大家能用上~

  • 相关阅读:
    2020以去过半,写一下上半年的总结跟下半年的计划
    js实现浏览器打印功能
    看不见远程新建git分支
    Vue中导出Excel表格方法
    SVN命令使用详解
    IOS NSTimer 定时器用法总结
    静态库与动态库的区别?
    iOS 本地缓存实现 方案借鉴
    IOS开发中NSRunloop跟NSTimer的问题
    FMDB
  • 原文地址:https://www.cnblogs.com/dxf813/p/7662129.html
Copyright © 2011-2022 走看看