摘要
pandas是基於Numpy衍生的一種工具,用於解決資料分析中的數學問題,包含了大量的庫和標準資料模型,提供了可用於高效操作大型資料集的工具,本文介紹Pandas的一些基本的使用方法,以及在金融資料分析方面的實際應用。本文對pandas的引入按照約定俗成的方式縮寫成pd進行引入。
pandas的資料結構pandas資料結構主要分為三種,分別是:
Series(一維陣列)DataFrame(二維表格型資料結構)Panel(三維陣列)1 、Series
Series指一維陣列,與numpy中的一維陣列Array類似,只允許儲存相同的資料型別,更加高效的使用記憶體,提高運算效率。
Series增加了對應的標籤(label)用於索引,可以包含0個或多個任意資料型別的實體,其中,標籤索引賦予了Series強大的存取元素的功能,除了透過位置以外,還可以透過對應的索引值進行存取,其功能類似於字典資料型別。
#Series建立的三種方法#(1)使用列表建立s1 = pd.Series(data=[1,3,4,5,6])#(2)使用numpy建立s2 = pd.Series(data=np.linspace(1,6,3), index=['數學','英語','語文'])#(3)使用字典建立,此時index不能傳入,因為字典中已經包含了該值dict = {'數學':100,'英語':90,'語文':99}s3 = pd.Series(data=dict)s1:0 11 32 43 54 6dtype: int64s2:數學 1.0英語 3.5語文 6.0dtype: float64s3:數學 100英語 90語文 99dtype: object
Series的字串表現形式是索引值在左,值在右邊。如果沒有指定index,則系統自動分配0~n-1的整數索引,如上述的s1所示。如果指定index,則按照指定的index值作為索引。可以透過index和values關鍵字獲取索引和資料。
s3.indexs3.valuesIndex(['s3的索引值:數學','s3的索引值:英語','s3的索引值:語文'], dtype='object')['s3的資料值:100','s3的資料值:90' ,'s3的資料值:99']
#Series 獲取資料的方法#(1)直接使用[]讀取索引值獲取s3['數學‘]——> 100s3[['數學‘,'英語‘,'語文‘]]——> 100 90 99#(2)使用.loc方法索引值獲取s3.loc['數學‘]——> 100s3.loc[['數學‘,'英語‘,'語文‘]] ——> 100 90 99#(3)直接使用[]讀取列標數獲取s3[0]——> 100s3[[0,1,2]]——> 100 90 99#(4)直接使用[]讀取列標數獲取s3.iloc[0]——> 100s3.iloc[[0,1,2]]——> 100 90 99#顯示資料統計性分析s3.describe() ——>count 3.000000mean 96.333333std 5.507571min 90.00000025% 94.50000050% 99.00000075% 99.500000max 100.000000#series轉換為字典物件s3.to_dict()——> {'數學': 100,'英語': 90, '語文': 99}
2、DataFrame
DataFrame物件是指二維資料結構,可以理解為公用相同index的多個Series的容器。在以字典或Series的字典的結構構建DataFrame時,最外面的字典對應DataFrame的列,內嵌的字典及Series則是其中的每個值。
obj = {'one':pd.Series([1,2,3], index=['a','b','c']),'two':pd.Series([1,2,3,4], index= ['a','b','c','d'])}df = pd.DataFrame(obj)---------------------- one twoa 1.0 1b 2.0 2c 3.0 3d NaN 4
從字典的列表中構建DataFrame時,其中的每一個字典代表的是每一條記錄(也即是二維資料表中的每一行),字典中每一個值對應的是這條記錄的相關屬性。
同時也可以從上面的例子中可以看出,當index不能相對應時,其中的空缺值會使用NaN填充。
#DataFrame顯示資料設定#1 True就是可以換行顯示。#設定成False的時候不允許換行pd.set_option('expand_frame_repr', False)#2 顯示的最大行數和列數,#如果超額就顯示省略號,這個指的是多少個pd.set_option('display.max_rows', 10)#3 dataFrame的列。#如果比較多又不允許換行,就會顯得很亂。pd.set_option('display.max_columns', 10)#4 顯示小數點後的位數pd.set_option('precision', 5)#5 truncate表示截斷,#info表示檢視資訊,一般選truncatepd.set_option('large_repr', A)#6 列長度pd.set_option('max_colwidth', 5)#7 絕對值小於0.5的顯示0.0pd.set_option('chop_threshold', 0.5)#8 顯示居中還是左邊,pd.set_option('colheader_justify', 'left')#9 橫向最多顯示多少個字元,# 一般80不適合橫向的螢幕,平時多用200.pd.set_option('display.width', 200)
2、pandas的資料讀寫將表格型資料讀取為DataFrame物件是pandas的重要特性。下表總結了部分實現該功能的函式,read_csv、read_excel、read_json、read_sql可能是後期使用最多的函式。
讀入資料後對資料進行統計分析,程式碼如下:
pd_csv = pd.read_csv('/Users/Desktop/stock.csv, encoding='utf-8')-------------------------------------- code tradeStatus code_name0 sh.000001 1 上證綜合指數1 sh.000002 1 上證A股指數2 sh.000003 1 上證-B股指數3 sh.000004 1 上證工業類指數4 sh.000005 1 上證商業類指數.. ... ... ...4658 sz.399994 1 中證資訊保安主題指數4659 sz.399995 1 中證基建工程指數4660 sz.399996 1 中證智慧家居指數4661 sz.399997 1 中證白酒指數4662 sz.399998 1 中證煤炭指數pd_csv = pd.read_csv('/Users/Desktop/stock.csv', encoding='utf-8')pd.set_option('display.max_rows',10)pd.set_option('display.max_columns',10)print(pd_csv.describe().T)print(pd_csv.info())----------------------------------- tradeStatuscount 4663.000000mean 0.996140std 0.062017min 0.00000025% 1.00000050% 1.00000075% 1.000000max 1.000000 -------------------------------------<class 'pandas.core.frame.DataFrame'>RangeIndex: 4663 entries, 0 to 4662Data columns (total 3 columns):# Column Non-Null Count Dtype--- ------ -------------- ----- 0 code 4663 non-null object 1 tradeStatus 4663 non-null int64 2 code_name 4663 non-null objectdtypes: int64(1), object(2)memory usage: 109.4+ KBNone
以上的describe()函式可以新增include = 'all'引數,這樣展示全部的統計結果,計算各列的計數、平均數、方差、最小值、最大值以及quantile數值。df.info()會展示資料型別、行列數和dataFrame佔用的記憶體。
3、pandas資料整理根據已經有的列建立新列
#根據已有的列建立新列pd_csv = pd.read_csv('/Users/Desktop/stock.csv', encoding='utf-8')#因為原資料中沒有‘ticker’列,此處新增一個新列tickerdef rands(x): return random.randint(1,8) pd_csv['ticker'] = [rands(x) for x in range(len(pd_csv['code']))]#ticker的值對應不同的型別b = {1:'銀行',2:'房地產',3:'採掘',4:'醫藥生物',5:'房地產',6:'採掘',7:'休閒服務',8:'機械裝置'}#遍歷原資料中的ticker,給ind賦值pd_csv['ind'] = pd_csv['ticker'].map(b)#顯示最終的資料表print(pd_csv)------------------------------------------ code tradeStatus code_name ticker ind0 sh.000001 1 上證綜合指數 6 採掘1 sh.000002 1 上證A股指數 5 房地產2 sh.000003 1 上證B股指數 1 銀行3 sh.000004 1 上證工業類指數 2 房地產4 sh.000005 1 上證商業類指數 3 採掘... ... ... ... ... ...4658 sz.399994 1 中證資訊保安主題指數 2 房地產4659 sz.399995 1 中證基建工程指數 4 醫藥生物4660 sz.399996 1 中證智慧家居指數 3 採掘4661 sz.399997 1 中證白酒指數 7 休閒服務4662 sz.399998 1 中證煤炭指數 2 房地產
DataFrame按照多列排序
pd_csv.sort_values( by=['ind','tradeStatus','code'], ascending=[False,True,True], inplace = True)print(pd_csv)--------------------------------------- code tradeStatus code_name ticker ind287 sh.600086 0 *ST金鈺 1 銀行774 sh.600677 0 *ST航通 1 銀行1484 sh.603507 0 振江股份 1 銀行2922 sz.002450 0 *ST康得 1 銀行5 sh.000006 1 上證房地產指數 1 銀行... ... ... ... ... ...4644 sz.399935 1 中證資訊科技指數 7 休閒服務4645 sz.399944 1 中證內地資源主題指數 7 休閒服務4648 sz.399965 1 中證800地產指數 7 休閒服務4653 sz.399982 1 中證500等權重指數 7 休閒服務4656 sz.399992 1 中證萬得併購重組指數 7 休閒服務
上述程式碼中,使用pd_csv.sort_values()進行排列,其中by中給出的列表是按照優先順序進行排列的,ascending中對應by中的字元,其中,False是指降序排列,True是指升序排列。inplace指是否覆蓋原始資料。從輸出的結果來看,結果正確。
如果我們在計算的過程中不再需要某一列,可以使用df.drop()函式進行操作。
pd_csv = pd.read_csv('/Users/Desktop/stock.csv', encoding='utf-8')#刪除某一列print(pd_csv.drop(columns = ['tradeStatus'],axis=1))#刪除某一行#第一種方法:利用內建函式drop(index = [index])#或者直接寫drop([index])也行。不改變data的值# 刪除第二行資料print(pd_csv.drop(index=[1]))# 刪除第二行資料print(pd_csv.drop([1]))#第二種方法:data.drop(data.index[1])# 刪除第二行資料print(pd_csv.drop(data.index[1]))
在處理資料的時候,很多時候會遇到批次替換的情況,如果一個一個去修改效率過低,也容易出錯。replace()是很好的方法。
1、替換全部或者某一行
#df.replace(to_replace, value,inplace = True)# 前面是需要替換的值,後面是替換後的值。pd_csv = pd.read_csv('/Users/Desktop/stock.csv', encoding='utf-8')print(pd_csv.head())print(pd_csv.replace('上證綜合指數', '上證A股指數').head())----------替換前資料----------------- code tradeStatus code_name0 sh.000001 1 上證綜合指數1 sh.000002 1 上證A股指數2 sh.000003 1 上證B股指數3 sh.000004 1 上證工業類指數4 sh.000005 1 上證商業類指數-----------替換後資料-------------- code tradeStatus code_name0 sh.000001 1 上證A股指數1 sh.000002 1 上證A股指數2 sh.000003 1 上證B股指數3 sh.000004 1 上證工業類指數4 sh.000005 1 上證商業類指數
這樣Python就會搜尋整個DataFrame並將文件中所有的上證綜合指數替換成了上證A股指數(要注意這樣的操作並沒有改變文件的源資料,要改變源資料需要使用inplace = True)
如果只想改變表格裡的某一列的值,可以直接指定該列進行替換就可以。
pd_csv = pd.read_csv('/Users/Desktop/stock.csv',encoding='utf-8')print(pd_csv.head())pd_csv['tradeStatus']. replace(1,0,inplace=True)print(pd_csv.head())---------------替換前資料----------- code tradeStatus code_name0 sh.000001 1 上證綜合指數1 sh.000002 1 上證A股指數2 sh.000003 1 上證B股指數3 sh.000004 1 上證工業類指數4 sh.000005 1 上證商業類指數--------------替換後資料------------- code tradeStatus code_name0 sh.000001 0 上證綜合指數1 sh.000002 0 上證A股指數2 sh.000003 0 上證B股指數3 sh.000004 0 上證工業類指數4 sh.000005 0 上證商業類指數
4、pandas的統計分析pandas描述和彙總方法
5、書籍推薦利用Python進行資料分析(原書第2版) 由Python pandas專案創始人Wes McKinney親筆撰寫,詳細介紹利用Python進行操作、處理、清洗和規整資料等方面的具體細節和基本要點。第2版針對Python 3.6進行全面修訂和更新,涵蓋新版的pandas、NumPy、IPython和Jupyter,並增加了很多實際應用例項,我覺得這本書能夠很很快的幫你入門資料分析
後記:關於pandas的使用方法太多了,限於篇幅,本篇就先講解一些基礎的應用和一些函式的總結,在下一篇文章中,重點講述關於pandas的資料選擇和分組技術,結合實際應用例項具體講解gruopby函式在股票方面的應用。對於pandas的學習需要多敲程式碼,多做總結。