Pandas中聚类计算与相关性统计
首先,数学基础:
相关系数:
相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。
简单相关系数:又叫相关系数或线性相关系数,一般用字母r 表示,用来度量两个变量间的线性关系。
定义式 [1]
其中,Cov(X,Y)为X与Y的协方差,Var[X]为X的方差,Var[Y]为Y的方差
复相关系数:又叫多重相关系数。复相关是指因变量与多个自变量之间的相关关系。例如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈现复相关关系。
典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间相关关系。
引自百科
协方差:
在概率论和统计学中,协方差可以用于衡量两个变量的总体误差。
期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义公式如下:
从直观上来看,协方差表示的是两个变量总体误差的期望。
如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值时同时另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值;如果两个变量的变化趋势相反,即其中一个变量大于自身的期望值时另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
如果X与Y是统计独立的,那么二者之间的协方差就是0,因为两个独立的随机变量满足E[XY]=E[X]E[Y]。
但是,反过来并不成立。即如果X与Y的协方差为0,二者并不一定是统计独立的。
协方差Cov(X,Y)的度量单位是X的协方差乘以Y的协方差。而取决于协方差的相关性,是一个衡量线性独立的无量纲的数。
协方差为0的两个随机变量称为是不相关的。
引自百科
在pandas中的简单实现
那么在我们的pandas当中,我们get到几个dataframe来自yahoo!的股票交易数据和成交量,然后进行分发计算,我们在pd中自然有对应的计算协方差以及相关系数的函数,我们可以通过pip安装需要的包:
Pip install pandas.datareader
然后进行导入和下载
import pandas_datareader.data as web
import pandas as pd
all_data = {ticker:web.get_data_yahoo(ticker)
for ticker in[‘AAPL’,‘IBM’,‘MSFT’,‘GOOG’]}
然后获取价格
price = pd.DataFrame({ticker:data[‘Adj Close’] for ticker,data in all_data.items()})
获取的结果如下:
价格矩阵: AAPL … GOOG
Date …
2010-02-11 19.005989 … 266.466888
2010-02-12 19.169575 … 264.837494
… … … …
[2280 rows x 4 columns]
总共四列的data和2280行的数据
分享了2009年到2019年的四大股票的成交价格
我们通过pct_change获取相邻数字之间的变化率:
returns = price.pct_change()
然后
print(returns.tail())
使用tail获取了目录末尾的几位结果.
结果:
Date AAPL IBM MSFT GOOG
2019-01-16 0.012217 -0.000904 0.003523 0.003546
2019-01-17 0.005938 0.004687 0.007022 0.008261
2019-01-18 0.006159 0.013340 0.014983 0.007670
2019-01-22 -0.022446 -0.010499 -0.018847
-0.025258
2019-01-23 0.004827 0.069707 0.005867 0.011452
接下来有了数据,我们使用corr函数计算相关系数
print(returns[‘AAPL’].cov(returns[‘GOOG’]))
0.4550456085662989
第一个returns代表AAPL这个series,第二个则是GOOG,两者之间的相关系数为0.4550左右,同样的方法,使用corr获取协方差的值:
print(returns[‘GOOG’].cov(returns[‘IBM’]))
结果:
7.838090621373146e-05协方差大于零说明这两者吃存在一定的线性或者非线性关系,那么这就是我们进一步挖掘的基础.
至于聚类计算,由于较为死板和简单,我直接拉上代码:对照实现即可
#method参数
obj_time = pd.Series([‘blue’,‘purp’,‘yellow’],index = [0,2,6])
obj_time = obj_time.reindex(range(10),
作者:张一极
更多作者优秀文章:http://siligence.ai/column/index.php?page=1