python pandasベース3

13510 ワード

宣言:本文は『python for data analysis』に基づいて整理する
 
1記述統計計算
(1)sumメソッド
 In [198]: df = DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'],  columns=['one', 'two'])
 In [199]: df 

 Out[199]:     one  two 

             a  1.40  NaN 

             b  7.10 -4.5 

             c   NaN  NaN 

             d  0.75 -1.3

sumメソッドを使用して合計を計算する
In [200]: df.sum() 

Out[200]: one    9.25 

               two   -5.80 

sumメソッドにaxisパラメータを入力すると統計的次元を変更できます
In [201]: df.sum(axis=1) 

Out[201]: a    1.40 

               b    2.60 

               c     NaN 

               d   -0.55

NaN値の場合、パラメータskipnanを使用して保存を選択できます(デフォルトでは無視されます).
In [202]: df.mean(axis=1, skipna=False) 

Out[202]: a      NaN 

          b    1.300 

          c      NaN 

         d   -0.275

(2)他の方法、例えばidxmaxとidaminは結果のインデックスを返す
In [203]: df.idxmax() 

Out[203]: one    b 

                two    d 

accumulations:
In [204]: df.cumsum() 

Out[204]: one two 

        a 1.40 NaN 

        b 8.50 -4.5 

        c NaN NaN 

        d 9.25 -5.8 

記述方法describe(R言語のsummaryを思い出す....)
デジタルデータフレームの場合
In [205]: df.describe() 

Out[205]:             one       two 

          count  3.000000  2.000000 

          mean   3.083333 -2.900000 

          std    3.493685  2.262742 

          min    0.750000 -4.500000 

          25%    1.075000 -3.700000 

          50%    1.400000 -2.900000 

          75%    4.250000 -2.100000 

          max    7.100000 -1.300000

文字型データフレームの場合
In [206]: obj = Series(['a', 'a', 'b', 'c'] * 4)
In [207]: obj.describe() 

Out[207]: count     16 

          unique    3 

          top       a 

          freq      8

 
(3)類似の方法とパラメータは以下の表の通りである.
Method                                  Description                                                                                                                        
count                                     Number of non-NA values describe Compute set of summary statistics for Series or each DataFrame column
min, max                               Compute minimum and maximum values
argmin, argmax                     Compute index locations (integers) at which minimum or maximum value obtained, respectively
idxmin, idxmax                      Compute index values at which minimum or maximum value obtained, respectively
quantile                                 Compute sample quantile ranging from 0 to 1
sum                                       Sum of values
mean                                     Mean of values median Arithmetic median (50% quantile) of values
mad                                       Mean absolute deviation from mean value
var                                         Sample variance of values
std                                         Sample standard deviation of values
skew                                     Sample skewness (3rd moment) of values
kurt                                       Sample kurtosis (4th moment) of values cumsum Cumulative sum of values
cummin, cummax                Cumulative minimum or maximum of values, respectively
cumprod                              Cumulative product of values
diff                                        Compute 1st arithmetic difference (useful for time series)
pct_change                          Compute percent changes
2.相関と共分散
彼らはいずれもペアのパラメータに従って結果を計算した.
次のコードはヤフー金融データ、一部の会社の株式データを取得するために使用されます.
import pandas.io.data as web
all_data = {} 

for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']:    

                 all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2000', '1/1/2010')

price = DataFrame({tic: data['Adj Close']                   

                for tic, data in all_data.iteritems()}) 

volume = DataFrame({tic: data['Volume']                    

                for tic, data in all_data.iteritems()})

変更率のパーセントを計算し、pct_を使用します.change
In [209]: returns = price.pct_change()
In [210]: returns.tail()
Out[210]:              AAPL      GOOG       IBM      MSFT Date                                              

          2009-12-24  0.034339  0.011117  0.004420  0.002747 

          2009-12-28  0.012294  0.007098  0.013282  0.005479 

          2009-12-29 -0.011861 -0.005571 -0.003474  0.006812 

          2009-12-30  0.012147  0.005376  0.005468 -0.013532 

          2009-12-31 -0.004300 -0.004416 -0.012609 -0.015432

(1)Seriesについてcorrは,交差する非NaNデータ,インデックスによって関連付けられた2組のSeriesの相関を計算するために用いられ,covは共分散を計算する
In [211]: returns.MSFT.corr(returns.IBM) Out[211]: 0.49609291822168838
In [212]: returns.MSFT.cov(returns.IBM) Out[212]: 0.00021600332437329015

(2)DataFrameのcorrとcovは全データの相関と共分散を返す.
In [213]: returns.corr() 

Out[213]:           AAPL      GOOG       IBM      MSFT 

             AAPL  1.000000  0.470660  0.410648  0.424550 

             GOOG  0.470660  1.000000  0.390692  0.443334 

             IBM   0.410648  0.390692  1.000000  0.496093 

             MSFT  0.424550  0.443334  0.496093  1.000000

 
In [214]: returns.cov() 

Out[214]:           AAPL      GOOG       IBM      MSFT 

          AAPL  0.001028  0.000303  0.000252  0.000309 

        GOOG  0.000303  0.000580  0.000142  0.000205 

           IBM   0.000252  0.000142  0.000367  0.000216 

          MSFT  0.000309  0.000205  0.000216  0.000516

3一意の値(uniqueを使用)、値の記数(周波数統計に相当、value_counts()を使用)、集合性
もし私たちがSeriesを持っていたら
In [217]: obj = Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c']) 

統計objに現れる異なる値はuniqueを用いる
In [218]: uniques = obj.unique()
In [219]: uniques 

Out[219]: array([c, a, d, b], dtype=object)

異なる値が発生した回数を統計したい場合はvalue_を使用します.counts
In [220]: obj.value_counts() 

Out[220]: c    3 

          a    3 

          b    2 

          d    1

isinは、集合ベクトルの包含関係を記述するために使用することができる
In [222]: mask = obj.isin(['b', 'c'])
In [223]: mask                                In [224]: obj[mask] 

Out[223]:                                        Out[224]:          

0     True                                                0    c             

1    False                                                5    b             

2    False                                                6    b             

3    False                                                7    c             

4    False                                                8    c            

5     True                                                  

6     True  


4欠落した値の処理
すべての欠落値をPandasでNaNで表し、pythonに内蔵されているNone値もNaNとして扱われます.
In [229]: string_data = Series(['aardvark', 'artichoke', np.nan, 'avocado'])
In [232]: string_data[0] = None
In [233]: string_data.isnull() 
Out[233]:      0     True 
               1     False 
               2     True 
               3    False

(1)欠落値の処理:削除
dropna()を使用するか、data[data.notnull()を使用するか
In [234]: from numpy import nan as NA
In [235]: data = Series([1, NA, 3.5, NA, 7])
In [236]: data.dropna() 
Out[236]: 
0 1.0 

2 3.5 

4 7.0 

dropna()メソッドは、空の値(または欠落した値)を含むすべての行と列を削除するため、パラメータhowを使用して削除を指定できます.how='all'は、すべての行が欠落している値(nan)値のみを削除することを意味します.
In [242]: data.dropna(how='all') 

Out[242]:     0    1   2 

             0   1  6.5   3 

             1   1  NaN NaN 

             3 NaN  6.5   3

パラメータaxis=1を入力して指定したカラムを削除することもできます.
In [243]: data[4] = NA
In [244]: data                                         In [245]: data.dropna(axis=1, how='all') 

Out[244]:                                              Out[245]:                                   

    0    1   2   4                                                 0    1   2                          

0   1  6.5   3 NaN                                             0   1  6.5   3                          

1   1  NaN NaN NaN                                             1   1  NaN NaN                          

2 NaN  NaN NaN NaN                                             2 NaN  NaN NaN                          

3 NaN  6.5   3 NaN                                             3 NaN  6.5   3

(2)欠落値の処理:塗りつぶし
使用方法fillna
データオブジェクトdf:
  In [248]: df                                   

           0                1               2                 

 0    -0.577087       NaN       NaN        

1      0.523772       NaN       NaN        

2    -0.713544       NaN       NaN                                       

3    -1.860761       NaN  0.560145                                       

4    -1.265934       NaN -1.063512                                       

5     0.332883 -2.359419 -0.199543                                       

6    -1.541996 -0.970736 -1.307030

0を使用してNaN値を入力
In [250]: df.fillna(0) 

Out[250]:           0         1         2 

            0 -0.577087  0.000000  0.000000 

           1  0.523772  0.000000  0.000000 

           2 -0.713544  0.000000  0.000000 

           3 -1.860761  0.000000  0.560145 

           4 -1.265934  0.000000 -1.063512 

           5  0.332883 -2.359419 -0.199543 

           6 -1.541996 -0.970736 -1.307030

また、dict(辞書)オブジェクトを塗りつぶしポリシーとして使用して、カラムのNaNデータをどのような数値で塗りつぶすかを指定することもできます(次のコード:1カラムのNaNを0.5で塗りつぶし、3カラム(存在しない)を-1で塗りつぶす)
In [251]: df.fillna({1: 0.5, 3: -1}) 

Out[251]:           0         1         2 

           0 -0.577087  0.500000       NaN 

          1  0.523772  0.500000       NaN 

          2 -0.713544  0.500000       NaN 

          3 -1.860761  0.500000  0.560145 

          4 -1.265934  0.500000 -1.063512 

          5  0.332883 -2.359419 -0.199543 

          6 -1.541996 -0.970736 -1.307030

また、戻り値を持つメソッドを入力パラメータとして使用することもできます.axisを指定して行または列を指定することもできます.
In [259]: data = Series([1., NA, 3.5, NA, 7])
In [260]: data.fillna(data.mean()) 

Out[260]:      0    1.000000 

               1    3.833333 

               2    3.500000 

               3    3.833333 

               4    7.000000

 
5階層インデックス
階層インデックスはpandasの重要な部分であり、高緯度データを低緯度で処理する視点を提供します.
(1)簡単に使う
  In [261]: data = Series(np.random.randn(10), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],[1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
  In [262]: data 

  Out[262]:      a   1    0.670216   

                     2    0.852965   

                     3   -0.955869 

                 b   1   -0.023493   

                     2   -2.304234   

                     3   -0.652469 

                 c   1   -1.218302   

                     2   -1.332610 

                 d   2    1.074623  

                     3    0.723642

(2)階層インデックスを使用してデータのサブセットをより正確に選択する
In [265]: data['b':'c']       

Out[265]:                                         

 b   1   -0.023493                             

     2   -2.304234                                

     3   -0.652469                            

 c   1   -1.218302                         

     2   -1.332610  

より深いサブセットを選択することもできます
In [267]: data[:, 2] 

Out[267]: a    0.852965

          b   -2.304234 

          c   -1.332610 

          d    1.074623

(3)stackメソッドとunstackを用いて階層インデックスのデータをそれぞれDataFrame型データと階層インデックスデータに復元する
In [268]: data.unstack() 

Out[268]:           1         2         3 

           a  0.670216  0.852965 -0.955869 

           b -0.023493 -2.304234 -0.652469 

           c -1.218302 -1.332610       NaN 

          d       NaN  1.074623  0.723642

(4)どの次元でも階層インデックスとして使用できる
In [270]: frame = DataFrame(np.arange(12).reshape((4, 3)),    index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns=[['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']])
In [271]: frame 

Out[271]:            Ohio       Colorado     

                    Green  Red     Green 

           a   1     0      1         2      

               2     3      4         5 

           b   1     6      7         8  

               2     9      10        11