溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)分析利器之Pandas

發(fā)布時間:2020-08-04 16:07:02 來源:ITPUB博客 閱讀:119 作者:HULK一線技術(shù)雜談 欄目:編程語言

Pandas是一個python的開源庫,它基于Numpy,提供了多種高性能且易于使用的數(shù)據(jù)結(jié)構(gòu)。Pandas最初被用作金融數(shù)據(jù)分析工具而開發(fā),由于它有著強(qiáng)大的功能,目前廣泛應(yīng)用于數(shù)據(jù)分析、機(jī)器學(xué)習(xí)以及量化投資等。下面來跟隨作者一起認(rèn)識下Pandas吧!

  如何開始

Pandas安裝方式十分簡單,如果使用Anaconda,Anaconda默認(rèn)就已經(jīng)為我們安裝好了Pandas,直接拿來用就可以了,推薦使用這種方式。

如果不用Anaconda,只需執(zhí)行如下命令即可:

pip install pandas

像其他python庫一樣,使用之前需要導(dǎo)入,通常采用如下方式:

import pandas as pd

2   Pandas數(shù)據(jù)結(jié)構(gòu)

Pandas的數(shù)據(jù)結(jié)構(gòu)包括 Series、 DataFrame以及 Panel,這些數(shù)據(jù)結(jié)構(gòu)基于 Numpy,因此效率很高。其中 DataFrame最為常用,是Pandas最主要的數(shù)據(jù)結(jié)構(gòu)。所有Pandas數(shù)據(jù)結(jié)構(gòu)都是值可變的,除 Series外都是大?。⊿ize)可變的, Series大小不可變。

Series

Series是一維的類似的數(shù)組的對象,它包含一個數(shù)組的數(shù)據(jù)(任意NumPy的數(shù)據(jù)類型)和一個與數(shù)組關(guān)聯(lián)的索引 。

>>> import pandas as pd>>> import numpy as np>>> s = pd.Series(np.random.randn(4))>>> s0    0.1027801    1.5230012    1.7700673    0.437553dtype: float64

可以看到Pandas默認(rèn)為我們生成了索引,它的結(jié)構(gòu)如下表所示:

0123
0.1027801.5230011.7700670.437553

我們也可以使用 index關(guān)鍵字為其指定索引:

>>> s = pd.Series(np.random.randn(4), index=['a', 'b', 'c', 'd'])>>> sa   -0.316668b    0.083363c   -0.520227d   -1.024034dtype: float64

DataFrame

DataFrame是二維的、類似表格的對象,是使用最為廣泛的Pandas數(shù)據(jù)結(jié)構(gòu)。DataFrame有行和列的索引,訪問便捷。它可以被看作是Series的字典:

>>> data = {'name': ['張三', '李四', '王五'],...         'gender': ['M', 'F', 'M'],...         'height': [174, 160, 185],...         'weight': [80, 48, 70]}>>> frame = pd.DataFrame(data)>>> frame  name gender  height  weight0   張三      M     174      801   李四      F     160      482   王五      M     185      70

結(jié)構(gòu)如下表所示


namegenderheightweight
0張三M17480
1李四F16048
2王五M18570

一方面,我們可以使用 columns關(guān)鍵字指定DataFrame列的順序,DataFrame的列將會嚴(yán)格按照 columns所指定的順序排列;另一方面,與Series相同,我們可以使用 index關(guān)鍵字為其指定索引:

>>> frame2 = pd.DataFrame(data, columns=['name', 'gender', 'weight'],...     index=['one', 'two', 'three'])>>> >>> frame2      name gender  weightone     張三      M      80two     李四      F      48three   王五      M      70

需要注意的是,DataFrame的同一列允許有不同類型的值(數(shù)字,字符串,布爾等),這便意味著:我們可以將 王五weight設(shè)置為 F。

  數(shù)據(jù)訪問和遍歷

DataFrame支持按下標(biāo)訪問:

  1. >>> frame2.iloc[0]

  2. name      張三

  3. gender     M

  4. weight    80

  5. Name: one, dtype: object


  6. >>> frame2.iloc[0]['weight']

  7. 80

也支持按索引訪問:

  1. >>> frame2.loc['two']

  2. name      李四

  3. gender     F

  4. weight    48

  5. Name: two, dtype: object


  6. >>> frame2.loc['two']['name']

  7. '李四'

因此,DataFrame也支持如下兩種遍歷方式:

>>> for i in range(0, len(frame2)):...     print(frame2.iloc[i])*** 輸出結(jié)果略 ***
>>> for index, row in frame2.iterrows():...     print(row)*** 輸出結(jié)果略 ***

  添加和刪除列

如果我們想增加一列,也非常方便,如計(jì)算BMI指數(shù):

>>> frame['BMI'] = frame['weight']/(frame['height']*frame['height']/10000)>>> frame  name gender  height  weight        BMI0   張三      M     174      80  26.4235701   李四      F     160      48  18.7500002   王五      M     185      70  20.452885

僅需一行代碼而無需遍歷。

刪除列:

>>> del frame2['gender']>>> frame2      name  weightone     張三      80two     李四      48three   王五      70

  添加和刪除行

添加行

>>> frame3 = pd.DataFrame([['小紅', 46], ['小明', 68]], columns = ['name', 'weight'], index=['four', 'five'])>>> frame4 = frame2.append(frame3)>>> frame4      name  weightone     張三      80two     李四      48three   王五      70four    小紅      46five    小明      68

刪除行

>>> frame4.drop('four')      name  weightone     張三      80two     李四      48three   王五      70five    小明      68

6    數(shù)據(jù)篩選

  • 按下標(biāo)取出前兩條記錄

>>> frame[:2]  name gender  height  weight       BMI0   張三      M     174      80  26.423571   李四      F     160      48  18.75000
  • 按其他條件篩選

如找到BMI>20的記錄:

>>> mask = (frame['BMI'] > 20)>>> frame.loc[mask]  name gender  height  weight        BMI0   張三      M     174      80  26.4235702   王五      M     185      70  20.452885

DataFrame還支持許多其他的操作,篇幅有限,在此不一一展開。

7     Panel

Panel是三維的數(shù)據(jù)結(jié)構(gòu),可以看作是DataFrame的字典,這種數(shù)據(jù)結(jié)構(gòu)使用很少,此處略過不提。

Pandas實(shí)戰(zhàn)

學(xué)習(xí)技術(shù)是為了更好的工作和生活,拋開應(yīng)用,技術(shù)也就失去了存在的意義。本文開篇中提到,Pandas作為數(shù)據(jù)分析工具的一個重要應(yīng)用場景是量化投資,在此我想分享一下使用pandas的一個場景:

我想篩選出A股市場中過去60個交易日表現(xiàn)好的那些股票。關(guān)于表現(xiàn)好,也許每個人都有自己的看法,我的標(biāo)準(zhǔn)如下

  • 漲幅夠大,區(qū)間累計(jì)漲幅達(dá)60%以上

  • 回撤小,區(qū)間內(nèi)任意單個交易日跌幅不超過7%,包括高開低走7%(套人的不算好股票);區(qū)間內(nèi)任意連續(xù)兩個交易日累計(jì)跌幅不超過10%,包括連續(xù)兩個交易日高開低走10%

我使用的數(shù)據(jù)源是TuShare,它提供了A股復(fù)權(quán)日線圖,不過它沒有提供復(fù)權(quán)數(shù)據(jù)的每日漲跌幅,所以我們需要對他進(jìn)行處理:

>>> import tushare as ts>>> import talib as tl>>> data = ts.get_k_data('300573', autype='qfq')>>> data['p_change'] = tl.ROC(data['close'], 1)

此處使用了TALib,一個開源的金融數(shù)據(jù)分析工具。

完成初步的數(shù)據(jù)處理之后,我們就可以運(yùn)行篩選條件了,截取代碼片段如下:

  1. threshold = 60

  2. if len(data) < threshold:

  3.    return False

  4. data = data.tail(n=threshold)


  5. ratio_increase = (data.iloc[-1]['close'] - data.iloc[0]['close']) / data.iloc[0]['close']

  6. if ratio_increase < 0.6:

  7.    return False


  8. for i in range(1, len(data)):

  9.    if data.iloc[i - 1]['p_change'] < -7 \

  10.            or (data.iloc[i]['close'] - data.iloc[i]['open'])/data.iloc[i]['open'] * 100 < -7 \

  11.            or data.iloc[i - 1]['p_change'] + data.iloc[i]['p_change'] < -10 \

  12.            or (data.iloc[i]['close'] - data.iloc[i - 1]['open']) / data.iloc[i - 1]['open'] * 100 < -10:

  13.        return False


  14. return True

最后的結(jié)果如下:

[('603986', '兆易創(chuàng)新'), ('603882', '金域醫(yī)學(xué)'), ('603501', '韋爾股份'), ('300782', '卓勝微'), ('300622', '博士眼鏡'), ('300502', '新易盛'), ('300492', '山鼎設(shè)計(jì)'), ('300433', '藍(lán)思科技'), ('300223', '北京君正'), ('002917', '金奧博'), ('002892', '科力爾'), ('002876', '三利譜'), ('002850', '科達(dá)利'), ('002819', '東方中科'), ('002600', '領(lǐng)益智造'), ('002241', '歌爾股份'), ('000049', '德賽電池')]

可以看到其中科技股獨(dú)領(lǐng)風(fēng)騷,誰讓我們大A是科技牛呢?

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI