1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Pandas最詳細(xì)教程來了!

        共 9733字,需瀏覽 20分鐘

         ·

        2021-04-23 22:55

        導(dǎo)讀:在Python中,進(jìn)行數(shù)據(jù)分析的一個(gè)主要工具就是Pandas。Pandas是Wes McKinney在大型對(duì)沖基金AQR公司工作時(shí)開發(fā)的,后來該工具開源了,主要由社區(qū)進(jìn)行維護(hù)和更新。


        Pandas具有NumPy的ndarray所不具有的很多功能,比如集成時(shí)間序列、按軸對(duì)齊數(shù)據(jù)、處理缺失數(shù)據(jù)等常用功能。Pandas最初是針對(duì)金融分析而開發(fā)的,所以很適合用于量化投資。

        作者:趙志強(qiáng) 劉志偉
        來源:大數(shù)據(jù)DT(ID:hzdashuju)




        在使用Pandas之前,需要導(dǎo)入Pandas包。慣例是將pandas簡寫為pd,命令如下:

        import pandas as pd

        Pandas包含兩個(gè)主要的數(shù)據(jù)結(jié)構(gòu):SeriesDataFrame。其中最常用的是DataFrame,下面我們先來學(xué)習(xí)一下DataFrame。


        01 DataFrame入門

        DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu)。每列都可以是不同的數(shù)據(jù)類型(數(shù)值、字符串、布爾值等)。

        DataFrame既有行索引也有列索引,這兩種索引在DataFrame的實(shí)現(xiàn)上,本質(zhì)上是一樣的。但在使用的時(shí)候,往往是將列索引作為區(qū)分不同數(shù)據(jù)的標(biāo)簽。DataFrame的數(shù)據(jù)結(jié)構(gòu)與SQL數(shù)據(jù)表或者Excel工作表的結(jié)構(gòu)非常類似,可以很方便地互相轉(zhuǎn)換。

        下面先來創(chuàng)建一個(gè)DataFrame,一種常用的方式是使用字典,這個(gè)字典是由等長的list或者ndarray組成的,示例代碼如下:

        data={'A':['x','y','z'],'B':[1000,2000,3000],'C':[10,20,30]}
        df=pd.DataFrame(data,index=['a','b','c'])
        df

        運(yùn)行結(jié)果如圖3-2所示。

        ▲圖3-2

        我們可以看到,DataFrame主要由如下三個(gè)部分組成。

        • 數(shù)據(jù),位于表格正中間的9個(gè)數(shù)據(jù)就是DataFrame的數(shù)據(jù)部分。
        • 索引,最左邊的a、b、c是索引,代表每一行數(shù)據(jù)的標(biāo)識(shí)。這里的索引是顯式指定的。如果沒有指定,會(huì)自動(dòng)生成從0開始的數(shù)字索引。
        • 列標(biāo)簽,表頭的A、B、C就是標(biāo)簽部分,代表了每一列的名稱。

        下文列出了DataFrame函數(shù)常用的參數(shù)。其中,“類似列表”代表類似列表的形式,比如列表、元組、ndarray等。一般來說,data、index、columns這三個(gè)參數(shù)的使用頻率是最高的。

        • data:ndarray/字典/類似列表 | DataFrame數(shù)據(jù);數(shù)據(jù)類型可以是ndarray、嵌套列表、字典等
        • index:索引/類似列表 | 使用的索引;默認(rèn)值為range(n)
        • columns:索引/類似列表 | 使用的列標(biāo)簽;默認(rèn)值為range(n)
        • dtype:dtype | 使用(強(qiáng)制)的數(shù)據(jù)類型;否則通過推導(dǎo)得出;默認(rèn)值為None
        • copy:布爾值 | 從輸入復(fù)制數(shù)據(jù);默認(rèn)值為False

        其中data的數(shù)據(jù)類型有很多種。

        下文列舉了可以作為data傳給DataFrame函數(shù)的數(shù)據(jù)類型

        可以傳給DataFrame構(gòu)造器的數(shù)據(jù):

        • 二維ndarray:可以自行指定索引和列標(biāo)簽
        • 嵌套列表或者元組:類似于二維ndarray
        • 數(shù)據(jù)、列表或元組組成的字典:每個(gè)序列變成一列。所有序列長度必須相同
        • 由Series組成的字典:每個(gè)Series會(huì)成為一列。如果沒有指定索引,各Series的索引會(huì)被合并
        • 另一個(gè)DataFrame:該DataFrame的索引將會(huì)被沿用

        前面生成了一個(gè)DataFrame,變量名為df。下面我們來查看一下df的各個(gè)屬性值。

        獲取df數(shù)據(jù)的示例代碼如下:

        df.values

        輸出結(jié)果如下:

        array([['x'100010],
               ['y'200020],
               ['z'300030]], dtype=object)

        獲取df行索引的示例代碼如下:

        df.index

        輸出結(jié)果如下:

        Index(['a''b''c'], dtype='object')

        獲取df列索引(列標(biāo)簽)的示例代碼如下:

        df.columns

        輸出結(jié)果如下:

        Index(['A''B''C'], dtype='object')

        可以看到,行索引和列標(biāo)簽都是Index數(shù)據(jù)類型。

        創(chuàng)建的時(shí)候,如果指定了列標(biāo)簽,那么DataFrame的列也會(huì)按照指定的順序進(jìn)行排列,示例代碼如下:

        df=pd.DataFrame(data,columns=['C','B','A'],index=['a','b','c'])
        df

        運(yùn)行結(jié)果如圖3-3所示。

        ▲圖3-3

        如果某列不存在,為其賦值,會(huì)創(chuàng)建一個(gè)新列。我們可以用這種方法來添加一個(gè)新的列:

        df['D']=10
        df

        運(yùn)行結(jié)果如圖3-4所示。

        ▲圖3-4

        使用del命令可以刪除列,示例代碼如下:

        del df['D']
        df

        運(yùn)行結(jié)果如圖3-5所示。

        ▲圖3-5

        添加行的一種方法是先創(chuàng)建一個(gè)DataFrame,然后再使用append方法,代碼如下:

        new_df=pd.DataFrame({'A':'new','B':4000,'C':40},index=['d'])
        df=df.append(new_df)
        df

        運(yùn)行結(jié)果如圖3-6所示。

        ▲圖3-6

        或者也可以使用loc方法來添加行,示例代碼如下:

        df.loc['e']=['new2',5000,50]
        df

        運(yùn)行結(jié)果如圖3-7所示。

        ▲圖3-7

        loc方法將在后面的內(nèi)容中詳細(xì)介紹。

        索引的存在,使得Pandas在處理缺漏信息的時(shí)候非常靈活。下面的示例代碼會(huì)新建一個(gè)DataFrame數(shù)據(jù)df2。

        df2=pd.DataFrame([1,2,3,4,5],index=['a','b','c','d','z'],columns=['E'])
        df2

        運(yùn)行結(jié)果如圖3-8所示。

        ▲圖3-8

        如果現(xiàn)在想要合并df和df2,使得df有一個(gè)新的列E,那么可以使用join方法,代碼如下:

        df.join(df2)

        運(yùn)行結(jié)果如圖3-9所示。

        ▲圖3-9

        可以看到,df只接受索引已經(jīng)存在的值。由于df2中沒有索引e,所以是NaN值,而且df2索引為z的值已經(jīng)丟失了。為了保留df2中索引為z的值,我們可以提供一個(gè)參數(shù),告訴Pandas如何連接。示例代碼如下:

        df.join(df2,how='outer')

        運(yùn)行結(jié)果如圖3-10所示。

        ▲圖3-10

        在上述代碼中,how='outer'表示使用兩個(gè)索引中所有值的并集。連接操作的其他選項(xiàng)還有inner(索引的交集)、left(默認(rèn)值,調(diào)用方法的對(duì)象的索引值)、right(被連接對(duì)象的索引值)等。

        在金融數(shù)據(jù)分析中,我們要分析的往往是時(shí)間序列數(shù)據(jù)。下面介紹一下如何基于時(shí)間序列生成DataFrame。為了創(chuàng)建時(shí)間序列數(shù)據(jù),我們需要一個(gè)時(shí)間索引。這里先生成一個(gè)DatetimeIndex對(duì)象的日期序列,代碼如下:

        dates=pd.date_range('20160101',periods=8)
        dates

        輸出結(jié)果如下:

        DatetimeIndex(['2016-01-01''2016-01-02''2016-01-03''2016-01-04',
                       '2016-01-05''2016-01-06''2016-01-07''2016-01-08'],dtype='da
                           tetime64[ns]'
        , freq='D')

        可以看到,使用Pandas的date_range函數(shù)生成的是一個(gè)DatetimeIndex對(duì)象。date_range函數(shù)的參數(shù)及說明如下所示:

        • start:字符串/日期時(shí)間 | 開始日期;默認(rèn)為None
        • end:字符串/日期時(shí)間 | 結(jié)束日期;默認(rèn)為None
        • periods:整數(shù)/None | 如果start或者end空缺,就必須指定;從start開始,生成periods日期數(shù)據(jù);默認(rèn)為None
        • freq:dtype | 周期;默認(rèn)是D,即周期為一天。也可以寫成類似5H的形式,即5小時(shí)。其他的頻率參數(shù)見下文
        • tz:字符串/None | 本地化索引的時(shí)區(qū)名稱
        • normalize:布爾值 | 將start和end規(guī)范化為午夜;默認(rèn)為False
        • name:字符串 | 生成的索引名稱

        date_range函數(shù)頻率的參數(shù)及說明如下所示:

        • B:交易日
        • C:自定義交易日(試驗(yàn)中)
        • D:日歷日
        • W:每周
        • M:每月底
        • SM:半個(gè)月頻率(15號(hào)和月底)
        • BM:每個(gè)月份最后一個(gè)交易日
        • CBM:自定義每個(gè)交易月
        • MS:日歷月初
        • SMS:月初開始的半月頻率(1號(hào),15號(hào))
        • BMS:交易月初
        • CBMS:自定義交易月初
        • Q:季度末
        • BQ:交易季度末
        • QS:季度初
        • BQS:交易季度初
        • A:年末
        • BA:交易年度末
        • AS:年初
        • BAS:交易年度初
        • BH:交易小時(shí)
        • H:小時(shí)
        • T,min:分鐘
        • S:
        • L,ms:毫秒
        • U,us:微秒
        • N:納秒

        接下來,我們?cè)倩赿ates來創(chuàng)建DataFrame,代碼如下:

        df=pd.DataFrame(np.random.randn(8,4),index=dates,columns=list('ABCD'))
        df

        運(yùn)行結(jié)果如圖3-11所示。

        ▲圖3-11

        有了df,我們就可以使用多個(gè)基于DataFrame的內(nèi)建方法了,下面來看看相關(guān)的示例。

        按列求總和,代碼如下:

        df.sum()

        輸出結(jié)果如下:

        A    0.241727
        B   -0.785350
        C   -0.547433
        D   -1.449231
        dtype: float64

        按列求均值,代碼如下:

        df.mean()

        輸出結(jié)果如下:

        A    0.030216
        B   -0.098169
        C   -0.068429
        D   -0.181154
        dtype: float64

        按列求累計(jì)總和,代碼如下:

        df.cumsum()

        運(yùn)行結(jié)果如圖3-12所示。

        ▲圖3-12

        使用describe一鍵生成多種統(tǒng)計(jì)數(shù)據(jù),代碼如下:

        df.describe()

        運(yùn)行結(jié)果如圖3-13所示。

        ▲圖3-13

        可以根據(jù)某一列的值進(jìn)行排序,代碼如下:

        df.sort_values('A')

        運(yùn)行結(jié)果如圖3-14所示。

        ▲圖3-14

        根據(jù)索引(日期)排序(這里是倒序),代碼如下:

        df.sort_index(ascending=False)

        運(yùn)行結(jié)果如圖3-15所示。

        ▲圖3-15

        選取某一列,返回的是Series對(duì)象,可以使用df.A,代碼如下:

        df['A']

        輸出結(jié)果如下:

        2016-01-01   -1.142350
        2016-01-02   -0.816178
        2016-01-03    0.030206
        2016-01-04    1.930175
        2016-01-05    0.571512
        2016-01-06    0.220445
        2016-01-07    0.292176
        2016-01-08   -0.844260
        Freq: D, Name: A, dtype: float64

        使用[]選取某幾行,代碼如下:

        df[0:5]

        運(yùn)行結(jié)果如圖3-16所示。

        ▲圖3-16

        根據(jù)標(biāo)簽(Label)選取數(shù)據(jù),使用的是loc方法,代碼如下:

        df.loc[dates[0]]

        輸出結(jié)果如下:

        A   -1.142350
        B   -1.999351
        C    0.772343
        D   -0.851840
        Name: 2016-01-01 00:00:00, dtype: float64

        再來看兩個(gè)示例代碼。

        df.loc[:,['A','C']]

        運(yùn)行結(jié)果如圖3-17所示。

        ▲圖3-17

        df.loc['20160102':'20160106',['A','C']]

        運(yùn)行結(jié)果如圖3-18所示。

        ▲圖3-18

        需要注意的是,如果只有一個(gè)時(shí)間點(diǎn),那么返回的值是Series對(duì)象,代碼如下:

        df.loc['20160102',['A','C']]

        輸出結(jié)果如下:

        A   -0.816178
        C   -0.595195
        Name: 2016-01-02 00:00:00, dtype: float64

        如果想要獲取DataFrame對(duì)象,需要使用如下命令:

        df.loc['20160102':'20160102',['A','C']]

        運(yùn)行結(jié)果如圖3-19所示。

        ▲圖3-19

        上面介紹的是loc方法,是按標(biāo)簽(索引)來選取數(shù)據(jù)的。有時(shí)候,我們會(huì)希望按照DataFrame的絕對(duì)位置來獲取數(shù)據(jù),比如,如果想要獲取第3行第2列的數(shù)據(jù),但不想按標(biāo)簽(索引)獲取,那么這時(shí)候就可以使用iloc方法。

        根據(jù)位置選取數(shù)據(jù),代碼如下:

        df.iloc[2]

        輸出結(jié)果如下:

        A    0.030206
        B    0.759953
        C   -1.446549
        D   -0.874364
        Name: 2016-01-03 00:00:00, dtype: float64

        再來看一個(gè)示例:

        df.iloc[3:6,1:3]

        運(yùn)行結(jié)果如圖3-20所示。

        ▲圖3-20

        注意:對(duì)于DataFrame數(shù)據(jù)類型,可以使用[]運(yùn)算符來進(jìn)行選取,這也是最符合習(xí)慣的。但是,對(duì)于工業(yè)代碼,推薦使用loc、iloc等方法。因?yàn)檫@些方法是經(jīng)過優(yōu)化的,擁有更好的性能。

        有時(shí),我們需要選取滿足一定條件的數(shù)據(jù)。這個(gè)時(shí)候可以使用條件表達(dá)式來選取數(shù)據(jù)。這時(shí)傳給df的既不是標(biāo)簽,也不是絕對(duì)位置,而是布爾數(shù)組(Boolean Array)。下面來看一下示例。

        例如,尋找A列中值大于0的行。首先,生成一個(gè)布爾數(shù)組,代碼如下:

        df.A>0

        輸出結(jié)果如下:

        2016-01-01    False
        2016-01-02    False
        2016-01-03     True
        2016-01-04     True
        2016-01-05     True
        2016-01-06     True
        2016-01-07     True
        2016-01-08    False
        Freq: D, Name: A, dtype: bool

        可以看到,這里生成了一個(gè)Series類型的布爾數(shù)組??梢酝ㄟ^這個(gè)數(shù)組來選取對(duì)應(yīng)的行,代碼如下:

        df[df.A>0]

        運(yùn)行結(jié)果如圖3-21所示。

        ▲圖3-21

        從結(jié)果可以看到,A列中值大于0的所有行都被選擇出來了,同時(shí)也包括了BCD列。

        現(xiàn)在我們要尋找df中所有大于0的數(shù)據(jù),先生成一個(gè)全數(shù)組的布爾值,代碼如下:

        df>0

        運(yùn)行結(jié)果如圖3-22所示。

        ▲圖3-22

        下面來看一下使用df>0選取出來的數(shù)據(jù)效果。由圖3-23可以看到,大于0的數(shù)據(jù)都能顯示,其他數(shù)據(jù)顯示為NaN值。

        df[df>0]

        運(yùn)行結(jié)果如圖3-23所示。

        ▲圖3-23

        再來看一下如何改變df的值。首先我們?yōu)閐f添加新的一列E,代碼如下:

        df['E']=0
        df

        運(yùn)行結(jié)果如圖3-24所示。

        ▲圖3-24

        使用loc改變一列值,代碼如下:

        df.loc[:,'E']=1
        df

        運(yùn)行結(jié)果如圖3-25所示。

        ▲圖3-25

        使用loc改變單個(gè)值,代碼如下:

        df.loc['2016-01-01','E'] = 2
        df

        運(yùn)行結(jié)果如圖3-26所示。

        ▲圖3-26

        使用loc改變一列值,代碼如下:

        df.loc[:,'D'] = np.array([2] * len(df))
        df

        運(yùn)行結(jié)果如圖3-27所示。

        ▲圖3-27

        可以看到,使用loc的時(shí)候,x索引和y索引都必須是標(biāo)簽值。對(duì)于這個(gè)例子,使用日期索引明顯不方便,需要輸入較長的字符串,所以使用絕對(duì)位置會(huì)更好。這里可以使用混合方法,DataFrame可以使用ix來進(jìn)行混合索引。比如,行索引使用絕對(duì)位置,列索引使用標(biāo)簽,代碼如下:

        df.ix[1,'E'] = 3
        df

        運(yùn)行結(jié)果如圖3-28所示。

        ▲圖3-28

        ix的處理方式是,對(duì)于整數(shù),先假設(shè)為標(biāo)簽索引,并進(jìn)行尋找;如果找不到,就作為絕對(duì)位置索引進(jìn)行尋找。所以運(yùn)行效率上會(huì)稍差一些,但好處是這樣操作比較方便。

        對(duì)于ix的用法,需要注意如下兩點(diǎn)。

        • 假如索引本身就是整數(shù)類型,那么ix只會(huì)使用標(biāo)簽索引,而不會(huì)使用位置索引,即使沒能在索引中找到相應(yīng)的值(這個(gè)時(shí)候會(huì)報(bào)錯(cuò))。
        • 如果索引既有整數(shù)類型,也有其他類型(比如字符串),那么ix對(duì)于整數(shù)會(huì)直接使用位置索引,但對(duì)于其他類型(比如字符串)則會(huì)使用標(biāo)簽索引。

        總的來說,除非想用混合索引,否則建議只使用loc或者iloc來進(jìn)行索引,這樣可以避免很多問題。


        02 Series

        Series類似于一維數(shù)組,由一組數(shù)據(jù)以及相關(guān)的數(shù)據(jù)標(biāo)簽(索引)組成。示例代碼如下:

        import pandas as pd
        s=pd.Series([1,4,6,2,3])
        s

        Out: 

        0    1
        1    4
        2    6
        3    2
        4    3

        在這段代碼中,我們首先導(dǎo)入pandas并命名為pd,然后向Series函數(shù)傳入一個(gè)列表,生成一個(gè)Series對(duì)象。在輸出Series對(duì)象的時(shí)候,左邊一列是索引,右邊一列是值。由于沒有指定索引,因此會(huì)自動(dòng)創(chuàng)建0到(N-1)的整數(shù)索引。也可以通過Series的values和index屬性獲取其值和索引。示例代碼如下:

        s.values

        Out:

        array([14623], dtype=int64)

        s.index

        Out: 

        Int64Index([01234], dtype='int64')

        當(dāng)然,我們也可以對(duì)索引進(jìn)行定義,代碼如下:

        s=pd.Series([1,2,3,4],index=['a','b','c','d'])
        s

        Out: 

        a    1
        b    2
        c    3
        d    4

        在這里,我們將索引定義為a、b、c、d。這時(shí)也可以用索引來選取Series的數(shù)據(jù),代碼如下:

        s['a']

        Out:

        1

        s[['b','c']]

        Out:
         
        b    2
        c    3

        對(duì)Series進(jìn)行數(shù)據(jù)運(yùn)算的時(shí)候也會(huì)保留索引。示例代碼如下:

        s[s>1]

        Out: 

        b    2
        c    3
        d    4

        s*3

        Out: 

        a     3
        b     6
        c     9
        d    12

        Series最重要的功能之一是在不同索引中對(duì)齊數(shù)據(jù)。示例代碼如下:

        s1=pd.Series([1,2,3],index=['a','b','c'])
        s2=pd.Series([4,5,6],index=['b','c','d'])
        s1+s2

        Out: 

        a   NaN
        b     6
        c     8
        d   NaN

        Series的索引可以通過賦值的方式直接修改,示例代碼如下:

        s.index

        Out:

        Index([u'a'u'b'u'c'u'd'], dtype='object')

        s.index=['w','x','y','z']
        s.index

        Out: 

        Index([u'w'u'x'u'y'u'z'], dtype='object')

        s

        Out: 

        w    1
        x    2
        y    3
        z    4

        本文摘編自Python量化投資:技術(shù)、模型與策略》,經(jīng)出版方授權(quán)發(fā)布。



        推薦閱讀

        (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

        論機(jī)器學(xué)習(xí)領(lǐng)域的內(nèi)卷

        機(jī)器學(xué)習(xí)博士自救指南

        機(jī)器學(xué)習(xí)必知必會(huì)的 6 種神經(jīng)網(wǎng)絡(luò)類型

        你見過的最全面的Python重點(diǎn)知識(shí)匯總

        100天搞定機(jī)器學(xué)習(xí):寫YAML配置文件

        100天搞定機(jī)器學(xué)習(xí):模型訓(xùn)練好了,然后呢?

        老鐵,三連支持一下,好嗎?↓↓↓

        瀏覽 19
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            叼逼视频 | 欧美一区二区三区四区夜夜大片 | 成人免费 做受成人网站 | 琪琪综合 | 强行撑开神里绫华粉嫩的玉腿视频 | 丰满中国女人裸交 | 豆花性视频 | 偷自拍视频区综合视频区 | 杨幂被男人桶到嗷嗷叫爽色哟哟 | 欧美三级片网站 |