Correlation and Covariance(相關性和協(xié)方差)
一些總結性的統(tǒng)計信息霹陡,如相關性和協(xié)方差瑞信,是從一對參數(shù)中計算出來的仇奶。舉個例子:使用add-on pandas-datareader軟件包進行一些統(tǒng)計操作。如果您還沒有安裝循未,可以通過conda或pip安裝:
conda install pandas-datareader
我們使用這個包里自帶的一些數(shù)據(jù)進行練習:
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']) #協(xié)方差
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() #顯示所有的協(xié)方差
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(唯一數(shù)值岖妄、數(shù)值計數(shù))
unique
功能可以為你提取一個Series里的唯一數(shù)值宫仗,即不重復數(shù)值:
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)
你會發(fā)現(xiàn)返回值沒有進行sort挤庇,你也可以對返回值進行排序:
In [17]: uniques.sort()
In [18]: uniques
Out[18]: array(['a', 'b', 'c', 'd'], dtype=object)
value_counts
功能可以計算每一個元素出現(xiàn)的頻率:
In [19]: obj.value_counts()
Out[19]:
a 3
c 3
b 2
d 1
dtype: int64
isin
功能可以幫助檢查某一個元素是否存在在數(shù)組里:
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來說,如何顯示每一個元素出現(xiàn)的次數(shù)呢嫡秕?
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) #計算每一個元素出現(xiàn)的次數(shù)玉工,如果遇到?jīng)]有出現(xiàn)過的元素,則顯示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