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標准差
以上主要為開發問題中遇到的場景,有局限性,希望大家能用上~