在處理實(shí)際的金融數(shù)據(jù)時(shí)巧号,一個(gè)條數(shù)據(jù)通常包含了多種類型的數(shù)據(jù)族奢,例如,股票的代碼是字符串裂逐,收盤價(jià)是浮點(diǎn)型歹鱼,而成交量是整型等泣栈。在C++中可以實(shí)現(xiàn)為一個(gè)給定結(jié)構(gòu)體作為單元的容器卜高,如向量(vector,C++中的特定數(shù)據(jù)結(jié)構(gòu))南片。在Python中掺涛,pandas包含了高級的數(shù)據(jù)結(jié)構(gòu)Series和DataFrame,使得在Python中處理數(shù)據(jù)變得非常方便疼进、快速和簡單薪缆。
pandas不同的版本之間存在一些不兼容性,為此伞广,我們需要清楚使用的是哪一個(gè)版本的pandas拣帽。
從一般意義上來講,Series可以簡單地被認(rèn)為是一維的數(shù)組嚼锄。Series和一維數(shù)組最主要的區(qū)別在于Series類型具有索引(index)减拭,可以和另一個(gè)編程中常見的數(shù)據(jù)結(jié)構(gòu)哈希(Hash)聯(lián)系起來。
DataFrame是將數(shù)個(gè)Series按列合并而成的二維數(shù)據(jù)結(jié)構(gòu)区丑,每一列單獨(dú)取出來是一個(gè)Series拧粪,這和SQL數(shù)據(jù)庫中取出的數(shù)據(jù)是很類似的。所以沧侥,按列對一個(gè)DataFrame進(jìn)行處理更為方便可霎,用戶在編程時(shí)注意培養(yǎng)按列構(gòu)建數(shù)據(jù)的思維。DataFrame的優(yōu)勢在于可以方便地處理不同類型的列宴杀,因此癣朗,就不要考慮如何對一個(gè)全是浮點(diǎn)數(shù)的DataFrame求逆之類的問題了,處理這種問題還是把數(shù)據(jù)存成NumPy的matrix類型比較便利一些旺罢。
預(yù)覽一下數(shù)據(jù)旷余,dataframe.head()和dataframe.tail()可以查看數(shù)據(jù)的頭五行和尾五行,若需要改變行數(shù)主经,可在括號內(nèi)指定荣暮。
dataframe.describe()提供了DataFrame中純數(shù)值數(shù)據(jù)的統(tǒng)計(jì)信息。
DataFrame提供了兩種形式的排序罩驻。一種是按行列排序穗酥,即按照索引(行名)或者列名進(jìn)行排序,可調(diào)用dataframe.sort_index,指定axis=0表示按索引(行名)排序砾跃,axis=1表示按列名排序骏啰,并可指定升序或者降序;第二種排序是按值排序抽高,可指定列名和排序方式判耕,默認(rèn)的是升序排序。
Series和DataFrame的類函數(shù)提供了一些函數(shù)翘骂,如mean()壁熄、sum()等,指定0按列進(jìn)行碳竟,指定1按行進(jìn)行草丧。
在panda中,Series可以調(diào)用map函數(shù)來對每個(gè)元素應(yīng)用一個(gè)函數(shù)莹桅,DataFrame可以調(diào)用apply函數(shù)對每一列(行)應(yīng)用一個(gè)函數(shù)昌执,applymap對每個(gè)元素應(yīng)用一個(gè)函數(shù)。這里面的函數(shù)可以是用戶自定義的一個(gè)lambda函數(shù)诈泼,也可以是已有的其他函數(shù)懂拾。下例展示了將收盤價(jià)調(diào)整到[0, 1]區(qū)間:
print df[['closePrice']].apply(lambda x: (x - x.min()) / (x.max() - x.min())).head()
使用append可以在Series后添加元素,以及在DataFrame尾部添加一行铐达。
DataFrame另一個(gè)強(qiáng)大的函數(shù)是groupby岖赋,可以十分方便地對數(shù)據(jù)分組處理。
DataFrame可以像在SQL中一樣娶桦。
pandas數(shù)據(jù)直接可以繪圖查看贾节。
set_index('tradeDate')['closePrice']表示將DataFrame的'tradeDate'這一列作為索引,將'closePrice'這一列作為Series的值衷畦,返回一個(gè)Series對象栗涂,隨后調(diào)用plot函數(shù)繪圖,更多的參數(shù)可以在matplotlib的文檔中查看祈争。
dat = df[df['secID'] == '600028.XSHG'].set_index('tradeDate')['closePrice']
dat.plot(title="Close Price of SINOPEC (600028) during Jan, 2015")