首頁>技術>

摘要

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的學習需要多敲程式碼,多做總結。

15
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Radware Alteon負載均衡SLB詳解及配置