统计工具存档python版

import math
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
import scipy.stats as sci

def MySampleStdDev(vector,tool = 'python'):
    '''
    函数名: 样本标准差 <-> Sample_standard_deviation

    可接受数据类型 : list,tuple,pd.core.series.Series,np.ndarray

    计算方法 : 计算方法:将数据的每一个点与均值之间的差值计算出来
    (正负勿论,平方运算本来就会消除数值的负号,所以正负无需在意)
    再一一做2次方运算求出面积,并且把所有面积求和,最后再除以样本的
    个数,就能得到样本方差。

    公式意义 :
    样本标准差是样本与均值的偏离,计算方法特点除以n-1,原因:用样本方差估算总
    体方差总会比总体方差要小,所以要做无偏修正

    基本限制 :

    延展阅读 :

    :param vector: -> 向量
    :param tool ->
    :return: ->
    '''
    if vector == None:
        return 'The vector is missing one , please check data .t'

    elif tool == 'python' and isinstance(vector ,(list,tuple)) == True:
        #python 原始数据结构版本
        return (sum([(sum(vector)/len(vector)-i)**2 for i in vector])/len(vector)-1)**0.5

    elif tool == 'numpy' and isinstance(vector,(list , tuple , np.ndarray ,pd.core.series.Series)) == False:
        #numpy numpy的 np.std() 是总体标准差,所以还是要手撕
        npvector = np.array(vector)
        return np.sqrt(np.sum(np.square(npvector-np.mean(npvector)))/len(npvector)-1)
            #np.std(np.array(vector))
    else:
        return 'Incoming vector type error : \n ' \
               'must -> list , tuple , numpy.ndarray , pandas.Series '  # from scipy


def MyPopulationStdDev(vector,tool='python'):
    '''
    函数名: 总体标准差 <-> Population standard deviation

    可接受数据类型 : list,tuple,pd.core.series.Series,np.ndarray

    计算方法 :

    公式意义 :

    基本限制 :

    延展阅读 :

    :param vector: ->
    :return: ->
    '''
    if vector == None:
        return 'The vector is missing one , please check data .t'

    elif tool == 'python' and isinstance(vector, (list, tuple)) == True:
        # python原始数据结构版本
        return (sum([(sum(vector) / len(vector) - i) ** 2 for i in vector]) / len(vector)) ** 0.5

    elif tool == 'numpy' and isinstance(vector, (list , tuple ,np.ndarray, pd.core.series.Series)) == True:
        # numpy 自带函数
        # numpy 这里有个神坑,见说明
        # url:https://blog.csdn.net/zbq_tt5/article/details/100054087
        return np.std(np.array(vector))
    else:
        return 'Incoming vector type error : \n ' \
               'must -> list , tuple , numpy.ndarray , pandas.Series '  # from scipy

def MyCov(vector1 = None , vector2 = None):
    '''
    函数名: 协方差 <-> Covariance

    可接受数据类型 : list,tuple,pd.core.series.Series,np.ndarray

    计算方法 :

    公式意义 :
    在概率论和统计学中,协方差用于衡量两个变量的总体误差。而方差是协方差
    的一种特殊情况,即当两个变量是相同的情况。

    从直观上来看,协方差表示的是两个变量总体误差的期望。
    如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值时另
    外一个也大于自身的期望值,那么两个变量之间的协方差就是正值;如果两个
    变量的变化趋势相反,即其中一个变量大于自身的期望值时另外一个却小于自
    身的期望值,那么两个变量之间的协方差就是负值。

    基本限制 :

    延展阅读 :
    url : https://baike.baidu.com/item/协方差/2185936?fr=aladdin

    :param vector1:
    :param vector2:
    :return:
    '''

def Mypearson(vector1=None
            , vector2=None
            , plotKeyword = False
            , vector1name = 'vector1'
            , vector2name = 'vector2'
            ):
    '''
    函数名 : 皮尔森相关系数 <-> pearson

    可接受数据类型 : list,tuple,pd.core.series.Series,np.ndarray

    计算方法 :  两个连续变量(X,Y)的pearson相关性系数(Px,y)
    等于 ->
    它们之间的 '协方差cov(X,Y)' 除以它们各自标准差; '乘积(σX,σY)

    公式意义 :
    系数的取值总是在-1.0到1.0之间,接近0的变量被成为无相关性,
    接近1或者-1被称为具有强相关性。
    与斜方差相比,它并不会因为常数的位置变化而得出相关性的改变.
    皮尔森相关系数是衡量线性关联性的程度,p的一个几何解释是其
    代表两个变量的取值根据均值,集中后构成的向量之间夹角的余弦

    基本限制:
    两个向量的长度必须是一致的,计算的是总体标准差,请注意选择样本

    参数说明:
    :param vector1: -> 向量A
    :param vector2: -> 向量B
    :param plotKeyword: -> 是否画图,是则选择 True 否则选择 False
    :param vector1name: -> 自定义的变量名
    :param vector2name: -> 自定义的变量名
    :return: -> 皮尔逊相关系数 

    Matlab中代码 : cor = corr(Matrix,'type','Pearson')

    延展阅读1 :
    Pearson 相关系数是用协方差除以两个变量的标准差得到的,虽然协
    方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,
    小于0的时候表示两者负相关),但其数值上受量纲的影响很大,不能简单
    地从协方差的数值大小给出变量相关程度的判断。为了消除这种量纲的影响
    ,于是就有了相关系数的概念。

    延展阅读2 :
    量纲(dimension)也叫因次,是指物理量固有的、可度量的物理属性。
    一个物理量是由自身的物理属性(量纲)和为度量物理属性而规定的量度单
    位两个因素构成的。每一个物理量都只有一个量纲,不以人的意志为转移;
    每一个量纲下的量度单位(量度标准)是人为定义的,因度量衡的标准和尺
    度而异。量纲通常用一个表示该物理量的罗马正体大写字母表示。量纲分
    为基本量纲和导出量纲。国际单位制(SI)规定了七个基本物理量,相对
    应的是七个基本量纲;其他任何物理量的量纲均可以通过这些基本量纲导
    出,称为导出量纲。导出量纲与七个基本量纲一定满足对数线性组合关系。
    如果一个物理量可以用一个纯实数来衡量(如应变),则这个物理量为无量
    纲(又称“量纲一”或“纯数”)。无量纲量是量纲分析和相似理论的基础。
    量纲一的量可以进行各种超越运算;有量纲的量可以进行乘法运算和对数
    运算,规定有量纲量对数的量纲为量纲一;相同量纲的量可以进行加法运算
    。量纲的运算必须满足量纲和谐原理。

    算法说明1 : url :https://blog.csdn.net/huangfei711/article/details/78456165
    #算法说明1偏于学术
    算法说明2 : url :https://blog.csdn.net/AlexMerer/article/details/74908435
    #算法说明2便于理解基本概念

    使用代码示例:
    vector1 = [2, 7, 18, 88, 157 , 90, 177, 570]
    vector2 = [3, 5, 15, 90, 180, 88, 160, 580]
    print(pearson(vector1,vector2))
    '''

    if vector1 == None and vector2 == None:
        return 'No vector input'

    elif vector1 == None or vector2 == None:
        return 'The vector is missing one , please check data .'

    elif len(vector1) != len(vector2):
        return 'The vector length is inconsistent, please check .'

    elif isinstance(vector1,(list , tuple
                           , np.ndarray ,pd.core.series.Series)) == False \
            and isinstance(vector1,(list , tuple
                                    , np.ndarray ,pd.core.series.Series)) == False:

        return 'Incoming vector type error : \n ' \
               'must -> list , tuple , numpy.ndarray , pandas.Series ' #from scipy

    elif isinstance(vector1,(np.ndarray
                             , pd.core.series.Series)) == True \
        and isinstance(vector1,(np.ndarray
                                , pd.core.series.Series)) == True:

        if plotKeyword == True:
            sns.jointplot(x=vector1name
                          , y=vector2name
                          , data=pd.DataFrame({
                    vector1name: vector1  # 变量1
                    , vector2name: vector2})  # 变量2
                          , color='c'  # 画图颜色:c 青色 ,b 蓝色 ,r红色 , y黄色 ,
                          , kind="reg"
                          , height=8  # 图表大小(自动调整为正方形))
                          , ratio=5  # 散点图与布局图高度比,整型
                          )
            plt.show()
            plt.close()
            return sci.pearsonr(vector1,vector2)

        else:
            return sci.pearsonr(vector1,vector2)
    else:
        n = len(vector1)  # 计算向量长度
        # simple sums
        sum1 = sum(float(vector1[i]) for i in range(n))  # 向量转化浮点数
        sum2 = sum(float(vector2[i]) for i in range(n))
        # sum up the squares
        '''pow() 是计算数值的次方
        方法返回 xy(x的y次方)的值 ,说明链接
        '''
        '''计算:求向量每一个值的平方和'''
        sum1_pow = sum([pow(v, 2.0) for v in vector1])
        sum2_pow = sum([pow(v, 2.0) for v in vector2])
        # sum up the products
        '''计算:向量每一个值的一一相乘'''
        p_sum = sum([vector1[i] * vector2[i] for i in range(n)])
        # 分子num,分母den
        ''' 计算协方差 '''
        num = p_sum - (sum1 * sum2 / n)
        ''' 计算标准差'''
        den = math.sqrt((sum1_pow - pow(sum1, 2) / n) * (sum2_pow - pow(sum2, 2) / n))

        if den == 0:
            return 0.0

        elif plotKeyword == False:
            return num / den

        elif plotKeyword == True:
            sns.jointplot(x=vector1name
                          , y=vector2name
                          , data=pd.DataFrame({
                    vector1name: vector1  # 变量1
                    , vector2name: vector2})  # 变量2
                          , color='c'  # 画图颜色:c 青色 ,b 蓝色 ,r红色 , y黄色 ,
                          , kind="reg"
                          , height=8  # 图表大小(自动调整为正方形))
                          , ratio=5  # 散点图与布局图高度比,整型
                          )
            plt.show()
            plt.close()
            return num / den

if __name__ == '__main__':

    '''
    #皮尔逊相关系数测试
    vector1 = [2,1, 7, 18, 88, 157 , 90, 177, 570]
    vector2 = [3, 5, 15, 90, 180, 88, 160, 580]
    print(Mypearson(vector1,vector2,plotKeyword= True))
    '''
    '''
    vector = [2, 1, 7, 18, 88, 157, 90, 177, 570]
    print(MyPopulationStdDev(vector))
    print(MyPopulationStdDev(vector,tool='numpy'))
    '''
    '''
    vector = [2, 1, 7, 18, 88, 157, 90, 177, 570]
    print(MySampleStdDev(vector))
    print(MySampleStdDev(vector))
    '''













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值