使用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标准差
以上主要为开发问题中遇到的场景,有局限性,希望大家能用上~