pandas

汇总和计算描述统计

pandas中有一些常用的统计方法,主要功能是做约简和汇总统计。

In [188]: df = DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.74, -1.3]], index=['a','b','c','d'], columns=['one','two'])

In [190]: df
Out[190]:
    one  two
a  1.40  NaN
b  7.10 -4.5
c   NaN  NaN
d  0.74 -1.3

In [189]: df.sum()
Out[189]:
one    9.24
two   -5.80
dtype: float64

也可以逐列运算:

In [191]: df.sum(axis = 1)
Out[191]:
a    1.40
b    2.60
c    0.00
d   -0.56
dtype: float64

默认情况下,空缺值是被忽略掉的。通过skipna选项可以禁用此功能

In [193]: df.mean(axis=1, skipna=False)
Out[193]:
a     NaN
b    1.30
c     NaN
d   -0.28
dtype: float64
约简方法的选项

axis 约简的轴方向。DataFrame的行用0,列用1,代表逐行或者逐列运算。
skipna 排除缺失值,默认为True(排除)
level 如果轴是层次化索引的,则根据level分组约简

比较好玩的方法

查看更全面的汇总统计

In [194]: df.describe()
Out[194]:
            one       two
count  3.000000  2.000000
mean   3.080000 -2.900000
std    3.497027  2.262742
min    0.740000 -4.500000
25%    1.070000 -3.700000
50%    1.400000 -2.900000
75%    4.250000 -2.100000
max    7.100000 -1.300000

如果是非数值,统计的结果也不会不同:

In [195]: obj = Series(['a','a','b','c'] * 4)

In [196]: obj.describe()
Out[196]:
count     16
unique     3
top        a
freq       8
dtype: object

汇总统计常用的一些方法:
count 非NA值的数量
describe 针对Series或各DataFrame列计算汇总统计
min、max 计算最小值和最大值
**idxmin、idxmax 计算能够获取到最小值和最大值的索引值
argmin、argmax 计算能够获取到最小值和最大值的索引位置(区别于ID,arg代表着位置,它必定是整数。而id可能会是其他类型的索引值)
quantile 计算样本的分位数(0到1)
sum 值的总和
mean 值的平均数
median 值的算数中位数(50%分位数)
mad 根据平均值计算平均绝对离差
var 样本值的方差
std 样本值的标准差
skew 样本值的偏度
kurt 样本值的峰度
cumsum 样本值的累计和
cummin、cummax 样本值的累积最大值和累积最小值
cumprod 样本值的累计积
diff 计算一阶差分
pct_change 计算百分数变化

相关系数与协方差

有些汇总统计是需要通过参数对才能计算出来:

In [197]: import pandas_datareader as web

In [198]: all_data = {}

In [199]: for ticker in ['AAPL','IBM','MSFT','GOOG']:
     ...:     all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2000', '1/1/2010')
     ...:

In [200]: price = DataFrame({tic:data['Adj Close'] for tic, data in all_data.items()})

In [201]: volumn = DataFrame({tic:data['Volume'] for tic, data in all_data.items()})

这里我们获取了四家公司从2000/1/1-2010/1/1的pricecolumn数据

百分数变化
计算价格的百分数变化(将每个元素与其前一个元素进行比较,并计算变化百分比)

In [203]: returns = price.pct_change()

In [204]: returns.tail() #截取了末尾5行数据
Out[204]:
                AAPL       IBM      MSFT      GOOG
Date
2009-12-24  0.034339  0.004385  0.002587  0.011117
2009-12-28  0.012294  0.013326  0.005484  0.007098
2009-12-29 -0.011861 -0.003477  0.007058 -0.005571
2009-12-30  0.012147  0.005461 -0.013699  0.005376
2009-12-31 -0.004300 -0.012597 -0.015504 -0.004416

相关系数
相关系数指的是任何两个数值之间的线性关系
Seriescorr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。

In [207]: returns.IBM.corr(returns.MSFT)
Out[207]: 0.4925369653007891

某行或列也可以对DataFrame计算相关系数:
IBM这一列对DataFrame逐列计算相关系数

In [209]: returns.corrwith(returns.IBM)
Out[209]:
AAPL    0.412392
IBM     1.000000
MSFT    0.492537
GOOG    0.390689
dtype: float64

协方差
指的是计算两个数据之间的联系,如果结果协方差越大证明两者的变化趋势越紧密。反之则变化趋势截然相反。

In [208]: returns.MSFT.cov(returns.IBM)
Out[208]: 0.00021557766780962772

唯一值、值计数以及成员资格

唯一值
unique函数可以获取Series对象去掉重复值后的数组

In [214]: obj = Series(['c','a','b','b','a','c','d','e','b','a'])

In [215]: obj
Out[215]:
0    c
1    a
2    b
3    b
4    a
5    c
6    d
7    e
8    b
9    a
dtype: object

In [216]: uniques = obj.unique()

In [217]: uniques
Out[217]: array(['c', 'a', 'b', 'd', 'e'], dtype=object)

值计数
顾名思义就是对Series对象中各个值出现的次数做统计

In [218]: obj.value_counts()
Out[218]:
b    3
a    3
c    2
d    1
e    1
dtype: int64

** 成员资格**
isin是用于判断Series或者DataFrame中是否存在某个值或某些值

In [221]: mask = obj.isin(['b','c'])

In [222]: mask
Out[222]:
0     True
1    False
2     True
3     True
4    False
5     True
6    False
7    False
8     True
9    False
dtype: bool