常用的数学和统计方法
pandas
对象拥有一组常用的数学和统计方法。他们大都属于约简和汇总统计,用于从Series
提取单个值(如sum
或mean
)或从DataFrame
的行或列中提取一个Series
。它们都是基于没有缺失数据的假设而构建的。
例:
In [4]: 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 [5]: df
Out[5]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [6]: df.sum()
Out[6]:
one 9.25
two -5.80
dtype: float64
In [7]: df.sum(axis=1)
Out[7]:
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
NA
值会自动被排除,除非整个切片都是NA
。通过skipna(skip NA)
选项可以禁用该功能:
In [8]: df.mean(axis=1, skipna=False)
Out[8]:
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
约简方法的选项:axis
、skipna
、level
(如果轴是层次化索引的,则根据level
分组约简)。
有些方法(如idxmin
和idxmax
)返回的是间接统计(比如达到最小值最大值的索引):
In [9]: df.idxmax()
Out[9]:
one b
two d
dtype: object
有些方法则是累计型的:
In [10]: df.cumsum()
Out[10]:
one two
a 1.40 NaN
b 8.50 -4.5
c NaN NaN
d 9.25 -5.8
还有一些,比如describe
,用于一次性产生多个汇总统计:
In [11]: df.describe()
Out[11]:
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
对于非数值型数据,describe
会产生另外一种汇总统计:
In [12]: obj = Series(['a', 'a', 'b', 'c'] * 4)
In [14]: obj.describe()
Out[14]:
count 16
unique 3
top a
freq 8
dtype: object
所有与描述统计相关的方法:见#2467
相关系数与协方差(?):
通过参数对计算出来的:
Series
的corr
方法用来计算两个Series
中重叠的、非NA
的、按索引对齐的值的相关系数,cov
用于计算协方差:
In [39]: test.describe()
Out[39]:
Open High Low Close Adj Close \
count 1594.000000 1594.000000 1594.000000 1594.000000 1594.000000
mean 4.681644 4.759398 4.611951 4.688137 4.515610
std 1.280538 1.327283 1.237487 1.285679 1.240624
min 2.980000 2.990000 2.960000 2.980000 2.886848
25% 3.550000 3.580000 3.510000 3.550000 3.433305
50% 4.545000 4.605000 4.470000 4.540000 4.412471
75% 5.450000 5.540000 5.360000 5.450000 5.212986
max 10.430000 10.740000 9.850000 10.540000 10.383811
Volume
count 1.594000e+03
mean 1.460281e+08
std 1.729750e+08
min 0.000000e+00
25% 5.921724e+07
50% 9.124301e+07
75% 1.464500e+08
max 1.644112e+09
In [40]: returns.tail()
Out[40]:
000001.SS 399001.SZ
Date
2016-12-26 0.003992 0.003290
2016-12-27 -0.002532 -0.000278
2016-12-28 -0.003990 -0.004243
2016-12-29 -0.001979 -0.002720
2016-12-30 0.002435 0.001741
In [41]: returns['000001.SS'].corr(returns['399001.SZ'])
Out[41]: 0.93169755572940594
In [42]: returns['000001.SS'].cov(returns['399001.SZ'])
Out[42]: 0.00023805940957128392
DataFrame
的corr
和cov
方法将以DataFrame
的形式返回完整的相关系数或协方差矩阵:
In [43]: returns.corr()
Out[43]:
000001.SS 399001.SZ
000001.SS 1.000000 0.931698
399001.SZ 0.931698 1.000000
In [44]: returns.cov()
Out[44]:
000001.SS 399001.SZ
000001.SS 0.000217 0.000238
399001.SZ 0.000238 0.000301
利用DataFrame
的corrwith
方法,可以计算其列或行跟另一个Series
或DataFrame
之间的相关系数。
传入一个Series
将会返回一个相关系数值Series
(针对各列进行计算):
In [46]: returns.corrwith(returns['000001.SS'])
Out[46]:
000001.SS 1.000000
399001.SZ 0.931698
dtype: float64
传入一个DataFrame
则会计算按列名配对的相关系数:
这里计算百分比变化与成交量的相关系数:
In [47]: returns.corrwith(volume)
Out[47]:
000001.SS 0.066091
399001.SZ -0.007895
dtype: float64
唯一值(unique)、值计数(value_counts)以及成员资格(isin):
从一维Series
的值中抽取信息:
例:
In [48]: obj = Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
In [49]: uniques = obj.unique()
In [50]: uniques
Out[50]: array(['c', 'a', 'd', 'b'], dtype=object)
value_counts
用于计算一个Series
中各值出现的频率:
结果是按值频率降序排列:
In [51]: obj.value_counts()
Out[51]:
c 3
a 3
b 2
d 1
dtype: int64
isin
用于判断矢量化集合的成员资格,可用于选取子集:
In [52]: mask = obj.isin(['b', 'c'])
In [53]: mask
Out[53]:
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
In [54]: obj[mask]
Out[54]:
0 c
5 b
6 b
7 c
8 c
dtype: object