汇总和计算描述统计
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的price
和column
数据
百分数变化
计算价格的百分数变化(将每个元素与其前一个元素进行比较,并计算变化百分比)
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
相关系数
相关系数指的是任何两个数值之间的线性关系
Series
的corr
方法用于计算两个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