person correlation,spearman correlation and kendall's t的算法(python,算法来自FRM-market risk )

简介: person correlation,spearman correlation and kendall's t的算法(python,算法来自FRM-market risk )
# this module aims to calculate the correlation:
# person correlation,spearman correlation and kendall's t
# note:there is also maturity algorithm in pandas,numpy
# scipy,and statsmodels and so on,this module just write
# my mind when I read market risk measurement and management
###########################################################
import pandas as pd
import numpy as  np
from collections import Iterable
from itertools import combinations
# person correlation
def person_cor(x,y):
    '''this function  is uesed to calculate person correlation,
    it requires pandas:import pandas as pd
    Arguments:
        data {[list,array,series]} -- [python's list,
                pandas's series,numpy's array]
    '''
    if isinstance(x,Iterable):
        x=pd.Series(x)
    else:
        print('x is not a iterable')
        return 
    if isinstance(y,Iterable):
        y=pd.Series(y)
    else:
        print('y is not a iterable')
        return 
    xy=x*y
    xx=x*x
    yy=y*y
    e_x=x.mean()
    e_y=y.mean()
    e_xy=xy.mean()
    e_x_e_y=x.mean()*y.mean()
    e_xx=xx.mean()
    e_yy=yy.mean()
    return (e_xy-e_x_e_y)/((e_xx-e_x**2)*(e_yy-e_y**2))**0.5
def spearman_cor(x,y):
    '''this function  is uesed to calculate person correlation,
    it requires pandas:import pandas as pd
    Arguments:
        data {[list,array,series]} -- [python's list,
                pandas's series,numpy's array]
    '''
    if isinstance(x,Iterable):
        x=pd.Series(x)
    else:
        print('x is not a iterable')
        return 
    if isinstance(y,Iterable):
        y=pd.Series(y)
    else:
        print('y is not a iterable')
        return 
    df=pd.DataFrame() 
    df['x']=x
    df['y']=y
    #sort value according x
    df=df.sort_values('x')  
    # x rank from low to high
    df['x_rank']=range(1,len(x)+1)
    # sort values according y
    df=df.sort_values('y')
    # y rank from low to high
    df['y_rank']=range(1,len(y)+1)
    # diff square
    df['diff']=df['x_rank']-df['y_rank']
    df['diff_square']=df['diff']**2
    # num length
    n=len(df)
    diff_2_sum=df['diff_square'].sum()
    return 1-(6*diff_2_sum/(n*(n*n-1)))
def kendall_t(x,y):
    '''this function  is uesed to calculate person correlation,
    it requires pandas:import pandas as pd
    Arguments:
        data {[list,array,series]} -- [python's list,
                pandas's series,numpy's array]
    '''
    x=[1,2,3]
    y=[2,3,4]
    if isinstance(x,Iterable):
        x=pd.Series(x)
    else:
        print('x is not a iterable')
        return 
    if isinstance(y,Iterable):
        y=pd.Series(y)
    else:
        print('y is not a iterable')
        return 
    df=pd.DataFrame() 
    df['x']=x
    df['y']=y
    #sort value according x
    df=df.sort_values('x')  
    # x rank from low to high
    df['x_rank']=range(1,len(x)+1)
    # sort values according y
    df=df.sort_values('y')
    # y rank from low to high
    df['y_rank']=rang(1,len(y)+1)
    tuple_list=list(zip(df['x_rank'],df['y_rank']))
    #tuple_list=list(zip(df['x_rank'],df['y_rank']))
    com_list=list(combinations(tuple_list,2))
    com_list=[[com[0][0],com[0][1],com[1][0],com[1][1]] for com in com_list]
    com_df=pd.DataFrame(com_list)
    com_df.columns=['x0','y0','x1','y1']
    com_df['num']=(com_df['x0']-com_df['y0'])*(com_df['x1']-com_df['y1'])
    con_num=len(com_df[com_df['num']>0])
    dis_num=len(com_df[com_df['num']<0])
    equal_num=len(com_df[com_df['num']==0])
    n=len(com_df)
    return 2*(con_num-dis_num)/(n*(n-1))

注:1、斯皮尔曼相关系数已经验证,和古扎拉蒂 计量经济学基础第五版 3.18计算结果一致。


#不足之处

#person correlation

'''


1、皮尔逊系数衡量的是线性的相关关系,但是,金融的相关往往是非线性的


2、皮尔逊相关系数为0并不意味着两个变量是独立的,只是没有线性的相关关系


3、当两个变量间的联合分布不是elliptical,回归系数没有有意义的解释


4、当进行相关性计算的时候,需要两个变量的方差都是有限的,而现实当中,

 有些分布的方差可能是无限的


5、当数据做过转换之后,计算的系数是没有意义的

'''

#spearman correlation,kendall's t

'''


1、是基于次序的,没有考虑数量的变化


2、因为忽略了奇异值,造成低估一些风险


3、当有很多次序是一样的时候,kendall's t计算的结果是歪曲的

'''



目录
相关文章
|
3天前
|
机器学习/深度学习 数据采集 算法
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
11 1
|
1天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
1天前
|
机器学习/深度学习 数据可视化 算法
【Python机器学习专栏】t-SNE算法在数据可视化中的应用
【4月更文挑战第30天】t-SNE算法是用于高维数据可视化的非线性降维技术,通过最小化Kullback-Leibler散度在低维空间保持数据点间关系。其特点包括:高维到二维/三维映射、保留局部结构、无需预定义簇数量,但计算成本高。Python中可使用`scikit-learn`的`TSNE`类实现,结合`matplotlib`进行可视化。尽管计算昂贵,t-SNE在揭示复杂数据集结构上极具价值。
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】层次聚类算法的原理与应用
【4月更文挑战第30天】层次聚类是数据挖掘中的聚类技术,无需预设簇数量,能生成数据的层次结构。分为凝聚(自下而上)和分裂(自上而下)两类,常用凝聚层次聚类有最短/最长距离、群集平均和Ward方法。优点是自动确定簇数、提供层次结构,适合小到中型数据集;缺点是计算成本高、过程不可逆且对异常值敏感。在Python中可使用`scipy.cluster.hierarchy`进行实现。尽管有局限,层次聚类仍是各领域强大的分析工具。
|
1天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
1天前
|
机器学习/深度学习 算法 Python
【Python 机器学习专栏】随机森林算法的性能与调优
【4月更文挑战第30天】随机森林是一种集成学习方法,通过构建多棵决策树并投票或平均预测结果,具有高准确性、抗过拟合、处理高维数据的能力。关键性能因素包括树的数量、深度、特征选择和样本大小。调优方法包括调整树的数量、深度,选择关键特征和参数优化。Python 示例展示了使用 GridSearchCV 进行调优。随机森林广泛应用于分类、回归和特征选择问题,是机器学习中的重要工具。
|
2天前
|
机器学习/深度学习 算法 数据挖掘
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
|
2天前
|
机器学习/深度学习 算法 数据挖掘
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(下)
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(下)
10 0
|
2天前
|
机器学习/深度学习 算法 搜索推荐
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(上)
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例
10 0