Correlation and Covariance(相关性和协方差)
一些总结性的统计信息,如相关性和协方差,是从一对参数中计算出来的。举个例子:使用add-on pandas-datareader软件包进行一些统计操作。如果您还没有安装,可以通过conda或pip安装:
conda install pandas-datareader
我们使用这个包里自带的一些数据进行练习:
In [1]: import pandas_datareader.data as web
In [2]: import pandas as pd
In [3]: all_data = {ticker: web.get_data_yahoo(ticker)
...: for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}
In [4]: price = pd.DataFrame({ticker: data['Adj Close']
...: for ticker, data in all_data.items()})
In [5]: volume = pd.DataFrame({ticker: data['Volume']
...: for ticker, data in all_data.items()})
In [6]: returns = price.pct_change()
In [7]: returns.tail()
Out[7]:
AAPL IBM MSFT GOOG
Date
2020-06-10 0.025728 -0.015166 0.037092 0.006654
2020-06-11 -0.048010 -0.091322 -0.053698 -0.042303
2020-06-12 0.008634 0.033048 0.007892 0.006653
2020-06-15 0.012367 -0.002133 0.006392 0.004720
2020-06-16 0.026502 0.028771 0.024505 0.016107
In [8]: returns['MSFT'].corr(returns['IBM']) #相关性
Out[8]: 0.5961744396638181
In [9]: returns['MSFT'].cov(returns['IBM']) #协方差
Out[9]: 0.0001662046843830794
In [10]: returns.corr() #求所有公司之间的相关性,所以这里自己与自己的相关性就是1.0
Out[10]:
AAPL IBM MSFT GOOG
AAPL 1.000000 0.530127 0.713621 0.644238
IBM 0.530127 1.000000 0.596174 0.528073
MSFT 0.713621 0.596174 1.000000 0.751929
GOOG 0.644238 0.528073 0.751929 1.000000
In [12]: returns.cov() #显示所有的协方差
Out[12]:
AAPL IBM MSFT GOOG
AAPL 0.000332 0.000156 0.000225 0.000201
IBM 0.000156 0.000259 0.000166 0.000146
MSFT 0.000225 0.000166 0.000300 0.000223
GOOG 0.000201 0.000146 0.000223 0.000295
你还可以指定计算某一列与其他几列的相关性:
In [13]: returns.corrwith(returns.IBM)
Out[13]:
AAPL 0.530127
IBM 1.000000
MSFT 0.596174
GOOG 0.528073
dtype: float64
Unique Values, Value Counts(唯一数值、数值计数)
unique
功能可以为你提取一个Series里的唯一数值,即不重复数值:
In [14]: obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
In [15]: uniques = obj.unique()
In [16]: uniques
Out[16]: array(['c', 'a', 'd', 'b'], dtype=object)
你会发现返回值没有进行sort,你也可以对返回值进行排序:
In [17]: uniques.sort()
In [18]: uniques
Out[18]: array(['a', 'b', 'c', 'd'], dtype=object)
value_counts
功能可以计算每一个元素出现的频率:
In [19]: obj.value_counts()
Out[19]:
a 3
c 3
b 2
d 1
dtype: int64
isin
功能可以帮助检查某一个元素是否存在在数组里:
In [21]: mask = obj.isin(['b','c'])
In [22]: mask #先判断b和c是否在每一项里
Out[22]:
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
In [23]: obj[mask] #返回判断为“True”的那些项
Out[23]:
0 c
5 b
6 b
7 c
8 c
dtype: object
与上面的'isin
功能相似的还有一个是Index.get_indexer
,可以感受一下:
In [24]: to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a']) #第一个Series
In [25]: unique_vals = pd.Series(['c', 'b', 'a']) #第2个Series
In [26]: pd.Index(unique_vals).get_indexer(to_match) #判断第二个series里的元素在第一个里的索引位置
Out[26]: array([0, 2, 1, 1, 0, 2])
那么对于dataframe来说,如何显示每一个元素出现的次数呢?
In [27]: data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
...: 'Qu2': [2, 3, 1, 2, 3],
...: 'Qu3': [1, 5, 2, 4, 4]})
In [28]: data
Out[28]:
Qu1 Qu2 Qu3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
In [29]: result = data.apply(pd.value_counts).fillna(0) #计算每一个元素出现的次数,如果遇到没有出现过的元素,则显示0
In [30]: result
Out[30]:
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0
网友评论