pandas小記:pandas計算工具-彙總統計

-柚子皮-發表於2014-05-12

彙總和計算描述統計:統計函式

pandas物件擁有一組常用的數學和統計方法。它們大部分都屬於約簡和彙總統計,用於從Series中提取的個值(如sum或mean)或從DataFrame的行或列中提取一個Series。

跟對應的NumPy陣列方法相比,它們都是基於沒有缺失資料的假設而構建的。

數學運算和約簡(比如對某個軸求和)可以根據不同的後設資料(軸編號)執行。靈活處理缺失資料。

描述和彙總統計

方法                                     說明
count                      非NA值的數量
describe                  針對Series或各DataFrame列計算彙總統計
min,max                 計算最小值和最大值
argmin,argmax        計算能夠獲取到最小值和最大值的索引位置(整數)
idxmin,idxmax         計算能夠獲取到最小值和最大值的索引值
quantile                   計算樣本的分位數(0到 1)
sum                        值的總和
mean                      值的平均數, a.mean() 預設對每一列的資料求平均值;若加上引數a.mean(1)則對每一行求平均值
media                      值的算術中位數(50%分位數)
mad                         根據平均值計算平均絕對離差
var                          樣本值的方差
std                        樣本值的標準差
skew                     樣本值的偏度(三階矩)
kurt                       樣本值的峰度(四階矩)
cumsum                 樣本值的累計和
cummin,cummax    樣本值的累計最大值和累計最小
cumprod                樣本值的累計積
diff                        計算一階差分(對時間序列很有用)
pct_change            計算百分數變化


>>>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'])
>>>df

    one  two
a  1.40  NaN
b  7.10 -4.5
c   NaN  NaN
d  0.75 -1.3

約簡方法

這些方法並不會改變dataframe本身,而是返回一個改變的值?

約簡方法的選項

選項         說明
axis      約簡的軸。DataFrame的行用0,列用1
skipna      排除缺失值,預設值為True
level      如果軸是層次化索引的(即Multiindex),則根據level分組約簡

df.sum()

>>> df.sum()    #返回一個含有列小計的Series
one    9.25
two   -5.80
dtype: float64
#傳入axis=1將會按行進行求和運算:
>>> df.sum(axis=1)
a    1.40
b    2.60
c     NaN
d   -0.55
dtype: float64
NA值會自動被排除,除非整個切片(這裡指的是行或列)都是NA。

通過skipna選項可 以禁用該功能:
>>> df.mean(axis=1, skipna=False)
a      NaN
b    1.300
c      NaN
d   -0.275
dtype: float64

df.mean()

計算df行均值df.mean(axis = 1)

相當於將其轉換成numpy.array後進行下面操作

user_rat_cnt = [np.count_nonzero(rat_array[i]) for i in range(len(rat_array))]  # 每個使用者打分個數
user_rat_mean = rat_array.sum(axis=1) / user_rat_cnt  # 每個使用者打分均值
print(user_rat_mean)

df.sub

Operating with objects that have different dimensionality and need alignment.In addition, pandas automatically broadcasts along the specified dimension.

Equivalent to dataframe - other, but with support to substitute a fill_value for missing data in one of the inputs.

In [63]: s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
In [64]: s
Out[64]: 
2013-01-01   NaN
2013-01-02   NaN
2013-01-03     1
2013-01-04     3
2013-01-05     5
2013-01-06   NaN
Freq: D, dtype: float64

In [65]: df.sub(s, axis='index')
Out[65]: 
                   A         B         C   D   F
2013-01-01       NaN       NaN       NaN NaN NaN
2013-01-02       NaN       NaN       NaN NaN NaN
2013-01-03 -1.861849 -3.104569 -1.494929   4   1
2013-01-04 -2.278445 -3.706771 -4.039575   2   0
2013-01-05 -5.424972 -4.432980 -4.723768   0  -1
2013-01-06       NaN       NaN       NaN NaN NaN

df.sub引數axis:

pandas.dataframe每行都減去行平均值

use DataFrame's sub method and specify that the subtraction should happen row-wise (axis=0) as opposed to the default column-wise behaviour:

df.sub(df.mean(axis=1), axis=0)

df.std

注意標準差或者方差的計算
DataFrame.std(axis=None,skipna=None,level=None,ddof=1,numeric_only=None,**kwargs)

Return unbiased standard deviation over requested axis.

Normalized by N-1 by default. This can be changed using the ddof argument

Parameters:

axis : {index (0), columns (1)}

skipna : boolean, default True

Exclude NA/null values. If an entire row/column is NA, the resultwill be NA

這裡ddof預設值=1,是無偏估計,計算的是樣本標準差,分母是n-1不是n。
引數設定為ddof=0才是有偏估計,計算的是總體標準差。

idxmin和idxmax

返回的是間接統計(比如達到最小值或最大值的索引):
>>> df.idxmax()
one    b
two    d

累計型計算cumsum

>>> df.cumsum()

多個彙總統計describe

既不是約簡型也不是累計型。用於一次性 產生多個彙總統計:
>>> df.describe()

            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

Note:

Describing一個DataFrame預設只有numeric的列的描述會返回. Describing all columns of a DataFrame regardless of data type. >>> df.describe(include='all')

對於非數值型資料,describe會產生另外一種彙總統計:
>>>obj = Series(['a','a','b','c'] * 4)
>>>obj
>>>obj.describe()
count     16
unique     3
top        a
freq       8
dtype: object

[Binary operator functions]

[Basic section on Binary Ops]

皮皮Blog

相關係數與協方差

有些彙總統計(如相關係數和協方差)是通過引數對計算出來的。

DataFrame資料

下面幾個 DataFrame資料來自Yahoo! Finance的股票價格和成交量:
>>>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 = pd.DataFrame({tic: data['Adj Close'] for tic, data in all_data.items()})

In[15]: price.head()
Out[15]:
                AAPL  GOOG        IBM       MSFT
Date                                            
2000-01-03  3.702290   NaN  90.897237  40.369145
2000-01-04  3.390148   NaN  87.811825  39.005468
2000-01-05  3.439760   NaN  90.897237  39.416736
2000-01-06  3.142089   NaN  89.330044  38.096351
2000-01-07  3.290924   NaN  88.938245  38.594201

>>>volume = pd.DataFrame({tic: data['Volume'] for tic, data in all_data.items()})

In[18]: volume.head()
Out[18]:
                 AAPL  GOOG       IBM      MSFT
Date                                           
2000-01-03  133949200   NaN  10347700  53228400
2000-01-04  128094400   NaN   8227800  54119000
2000-01-05  194580400   NaN  12733200  64059600
2000-01-06  191993200   NaN   7971900  54976600
2000-01-07  115183600   NaN  11856700  62013600

計算價格的百分數變化

>>>returns = price.pct_change()
In[20]: returns.tail()
Out[20]:
                AAPL      GOOG       IBM      MSFT
Date                                              
2009-12-24  0.034339  0.011117  0.004385  0.002587
2009-12-28  0.012294  0.007098  0.013326  0.005484
2009-12-29 -0.011861 -0.005571 -0.003477  0.007058
2009-12-30  0.012147  0.005376  0.005461 -0.013699
2009-12-31 -0.004300 -0.004416 -0.012597 -0.015504

Series.corr方法和cov

用於計算兩個Series中重疊的、非NA的、按索引對齊的值的相關係數。與此類似,cov用幹計算協方差:
>>>returns.MSFT.corr(returns.IBM)
0.49597970053200319
>>>returns.MSFT.cov(returns.IBM)
0.00021595764765417841
DataFrame的corr和cov方法將以DataFrame的形式返回完整的相關係數或協方差矩陣:
>>>returns.corr()

          AAPL      GOOG       IBM      MSFT
AAPL  1.000000  0.470676  0.410011  0.424305
GOOG  0.470676  1.000000  0.390689  0.443587
IBM   0.410011  0.390689  1.000000  0.495980
MSFT  0.424305  0.443587  0.495980  1.000000

Note:相關係數方法

 DataFrame.corr(method='pearson', min_periods=1)
    Compute pairwise correlation of columns, excluding NA/null values
    Parameters:    
    method : {‘pearson’, ‘kendall’, ‘spearman’}
            pearson : standard correlation coefficient
            kendall : Kendall Tau correlation coefficient
            spearman : Spearman rank correlation
    min_periods : int, optional
        Minimum number of observations required per pair of columns to have a valid result. Currently only available for pearson and spearman correlation
    Returns:    
    y : DataFrame

DataFrame.corrwith方法

利用DataFrame的corrwith方法,可以計算其列或行跟另一個Series或DataFrame之間的相關係數。傳入一個Series將會返回一個相關係數值Series (針對各列進行計算):
>>> returns.corrwith(returns.IBM)
AAPL    0.410011
GOOG    0.390689
IBM     1.000000
MSFT    0.495980
傳入一個DataFrame則會計算按列名配對的相關係數。下面計算了百分比變化與成交量的相關係數:
>>> returns.corrwith(volume)
AAPL   -0.057549
GOOG    0.062647
IBM    -0.007892
MSFT   -0.014245
dtype: float64
傳入axis=1即可按行進行計算。

無論如何,在計算相關係數之前,所有的資料項都會按標籤對齊。

[Statistical Functions]

皮皮Blog


視窗函式

[Window Functions]

皮皮Blog


聚合Aggregation

[Aggregation]

相關文章