pandas笔记(Summarizing and Computing Descriptive Statistics)

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

你可能感兴趣的:(pandas笔记(Summarizing and Computing Descriptive Statistics))