精华内容
下载资源
问答
  • python求上下四分位数
    千次阅读
    2020-12-11 08:18:15

    最近学习python数据分析,遇到了四分位数计算问题,因四分位数计算公式不一致,导致结果不一样,坑爹的百度只给了一种计算方法,容易迷惑初学者,故总结如下:

    计算方法

    三个四分位数的确定:

    先按从小到大方法排序,然后使用下列方法。

    方法1:n+1法

    Q1的位置= (n+1) × 0.25

    Q2的位置= (n+1) × 0.5

    Q3的位置= (n+1) × 0.75

    n表示数据的数据个数。

    上面的是大家常用的n+1法。还有一种是n-1法

    方法2:n-1法

    Q1的位置=1+(n-1)x 0.25

    Q2的位置=1+(n-1)x 0.5

    Q3的位置=1+(n-1)x 0.75

    当位置结果为小数时,则用两个位置上的数分别乘以小数和(1-小数)后相加。例如,当结果为6.25时,就用第六个位置的数*0.25+第七个位置的数*0.75后得到结果。

    下面举例说明。

    举例1(奇数个)假设有一组数据6,7,15,36,39,40,41,42,43,47,49。此数据已按从小到大顺序拍寻,因此不需要再排序,如未拍寻,需先进行排序。

    1、下面根据公式(n+1)法计算

    第一四分位数(下四分位数):(11+1)/4 =3,说明它在第三个位置,所以是15,即Q1=15。

    中位数:(11+1)/4*2=6,所以是40。

    第三四分位数(上四分位数):(11+1)/4*3=9, 所以是43。

    至此,Q1=15,Q2=40,Q3=43。

    2、下面根据公式(n-1)法计算

    第一四分位数(下四分位数):1+(11-1)x 0.25 =3.5,则Q1=15x0.5+36x0.5=25.5

    中位数:1+(11-1)x 0.5 =6,则Q2=15x0.5+36x0.5=40

    第三四分位数(上四分位数):1+(11-1)x 0.75 =8.5,则Q3=42x0.5+43x0.5=42.5

    下面用python实现计算。

    1 importpandas as pd2 s1 = pd.Series([6,7,15,36,39,40,41,42,43,47,49])3 s1.describe()

    结果如下:

    count 11.000000mean33.181818std15.873362min6.000000

    25% 25.500000

    50% 40.000000

    75% 42.500000max49.000000dtype: float64

    可见,python运行出来的结果是Q1=25.5 Q2=40 Q3=42.5。

    运行结果与n-1法一样,说明python用的是这种方法。

    举例2(偶数个)

    1 importnumpy as np2 importpandas as pd3 ser_obj=pd.Series([1,2,3,4,5,6])4 ser_obj.describe()

    1、下面根据公式(n+1)法计算

    第一四分位数(下四分位数):(6+1)/4 =1.75,说明它在第1.75位置,所以是1*0.25+2*0.75,即Q1=1.75。

    中位数:(6+1)/4*2=3.5,所以是3*0.5+4*0.5=3.5。

    第三四分位数(上四分位数):(6+1)/4*3=5.25, 所以是5*0.75+6*0.25=5.25。

    至此,Q1=1.75,Q2=3.5,Q3=5.25。

    2、下面根据公式(n-1)法计算

    第一四分位数(下四分位数):1+(6-1)x 0.25 =2.25,则Q1=2x0.75+3x0.25=2.25

    中位数:1+(6-1)x 0.5 =3.5,则Q2=3x0.5+4x0.5=3.5

    第三四分位数(上四分位数):1+(6-1)x 0.75 =4.75,则Q3=4*0.25+5*0.75=4.75

    下面用python实现计算。

    count 6.000000

    mean 3.500000

    std 1.870829

    min 1.000000

    25% 2.250000

    50% 3.500000

    75% 4.750000

    max 6.000000

    因此,pandas使用的是n-1法,人们通常使用n+1法。

    更多相关内容
  • python 计算箱线图、中位数、上下四分位数python 计算箱线图、中位数、上下四分位数等话不多说,如图上代码#数组都是按从小到大排过序的#计算中位数def count_median(lis):if len(lis) % 2 == 0:mid = float((lis...

    python 计算箱线图、中位数、上下四分位数等

    python 计算箱线图、中位数、上下四分位数等

    话不多说,如图

    5c768c140ead7d87380ca41a1a0a37ec.png

    上代码

    #数组都是按从小到大排过序的

    #计算中位数

    def count_median(lis):

    if len(lis) % 2 == 0:

    mid = float((lis[len(lis) / 2] + lis[len(lis) / 2 - 1])) / 2

    else:

    mid = lis[len(lis) / 2]

    return mid

    #计算上下四分位数

    def count_quartiles(lis):

    q1 = 1 + (float(len(lis)) - 1) * 1 / 4

    q3 = 1 + (float(len(lis)) - 1) * 3 / 4

    return q1, q3

    #计算上下边缘

    def count_margin(q1, q3):

    q4 = q3 + 1.5 * (q3 - q1)

    q5 = q1 - 1.5 * (q3 - q1)

    return q4, q

    python 计算箱线图、中位数、上下四分位数等相关教程

    展开全文
  • 数据库查询,最小值,最大值,平均值,上四分位数,中位数,下四分位数

    数据库求分组后求,平均成数,上四分位数,下四分位数,中位数

    1. 新建成绩表,包含字段(序号,班级id,学科名称,成绩,学生id)
    2. 查询班级id(CLASSID )为9的各个学科名称的平均成数,上四分位数,下四分位数,中位数
    """先创建一个数表SUBJECT,插入数据"""
    import pymysql,random
    dbs = pymysql.connect(host='localhost', user='root', password='root', db='demo', port=3306)
    db = dbs.cursor()
    # 创建成绩表 序号,班级id,学科名称,成绩,学生id
    db.execute("""
            CREATE TABLE SUBJECT(
            ID INT(3) PRIMARY KEY,
            CLASSID INT(10),
            SUBJECTNAME VARCHAR(20),
            STATYHOUR float(4),
            GARDEID int(10))
            """
            )
    # 插入数据
    a = 0
    CLASSIDS = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
    SUBJECTNAMEs = ['python','java','c','c++','mysql','db','gauss']
    while a<=1000: # 插入1000条数据
        a += 1
        CLASSID = CLASSIDS[random.randint(0,len(CLASSIDS)-1)]
        SUBJECTNAME = SUBJECTNAMEs[random.randint(0,len(SUBJECTNAMEs)-1)]
        STATYHOUR = round(random.uniform(1,150),2)
        GARDEID = random.randint(1,100)
        sql = "insert into SUBJECT(ID,CLASSID,SUBJECTNAME,STATYHOUR,GARDEID) values ({0},{1},'{2}',{3},{4});".format(a,CLASSID, SUBJECTNAME, STATYHOUR, GARDEID)
        db.execute(sql)
        dbs.commit()
        print(a)
    db.close()
    dbs.close()
    

    先模拟一组数据库数据分析上4:excel表格使用函数 =QUARTILE(B$3:B4,1)
    在这里插入图片描述
    分析发现:
    当行号 N==4的倍数+1的时候,得出的上四分位数恰好为当前行号,理解为:行号R = (N-1)/4+1 ,校验数据,若N=5得出R=2, 当N=9得出R=3, N=1得出R=1

    若N非4的倍数+1,这种情况下计算套用推理公式(R = (N-1)/4*1+1):
    若N=6,得出R=2.25 ,相近行号对应2,3 ;
    套用数据1,行号2,3对应的数据为2,3,
    上四分位数为1,25,而当前位置和差为1,
    推测出:
    上四分位数==(模拟数据(最大值)-模拟数(最小值))×(R-最小行号)+模拟数最小值

    1. 验证
      若N=6 得出R=2.25 — 模拟数据3对上四分位数 = (33-12)×(2.25-2)+12=17.25
      若N=7 得出R=2.5 — 模拟数据3对上四分位数 = (33-12)×(2.5-2)+12=22.5
      若N=8 得出R=2.75 — 模拟数据3对上四分位数 = (33-12)×(2.75-2)+12=27.25
      若N=10 得出R = 3.25 — 模拟数据1对上四分位数== … == 3.25
      若N=11 得出R = 3.5 — 模拟数据1对上四分位数== … == 3.5
      若N=12 得出R = 3.75 — 模拟数据1对上四分位数== … == 3.75
      … 和表格数据校验该方程成立

    第一次写上四分位数sql:

    with 
    t1 as(	select * 
    	from SUBJECT
    	where CLASSID = 9
    	),
    t2 as (	select 
    			SUBJECTNAME as b,
    			round((case
    				count(STATYHOUR) when '1' then max(STATYHOUR)
    			else
    			(
    			(max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*1+1)-min(r))+min(STATYHOUR)
    			) end ),2)as lowerQuartile
    		from(	select 
    				*
    				from (	select *,
    							row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
    							count(*) over(partition by SUBJECTNAME) as n
    						from t1
    					) as a1
    				where r >=((n-1)/4*1+1-0.75) and r<=((n-1)/4*1+1+0.75) 
    		)as t2
    	group by SUBJECTNAME)
    select * from t2;
    
    
    /*
    c	29.8
    c++	47.72
    db	29.18
    gauss	13.55
    java	58.96
    python	59.52
    */
    
    --优化后sql,去除case ... else ...验证结果也正确,这样可以少两行代码
    with 
    t1 as(	select * from 
    		SUBJECT
    	where CLASSID = 9
    	),
    t2 as (	select 
    			SUBJECTNAME as b,
    			round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*1+1)-min(r))+min(STATYHOUR)),2)as lowerQuartile
    		from(	select 
    				*
    				from (	select *,
    							row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
    							count(*) over(partition by SUBJECTNAME) as n
    						from t1
    					) as a1
    				where r >=((n-1)/4*1+1-0.75) and r<=((n-1)/4*1+1+0.75) 
    		)as a2
    	group by SUBJECTNAME)
    select * from t2;
    
    
    /*
    c	29.8
    c++	47.72
    db	29.18
    gauss	13.55
    java	58.96
    python	59.52
    */
    

    分析尝试R = (N-1)/41+1==上四分,那么中位数换位2,下四分换位*3,尝试SQL

    with 
    t1 as(	select * from SUBJECT
    	where CLASSID = 9
    	),
    t2 as (	select 
    			SUBJECTNAME as b,
    			round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*1+1)-min(r))+min(STATYHOUR)),2)as lowerQuartile
    		from(	select 
    				*
    				from (	select *,
    							row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
    							count(*) over(partition by SUBJECTNAME) as n
    						from t1
    					) as a1
    				where r >=((n-1)/4*1+1-0.75) and r<=((n-1)/4*1+1+0.75) 
    		)as a2
    	group by SUBJECTNAME),
    t3 as (	select 
    			SUBJECTNAME as b,
    			round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*2+1)-min(r))+min(STATYHOUR)),2)as median
    		from(	select 
    				*
    				from (	select *,
    							row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
    							count(*) over(partition by SUBJECTNAME) as n
    						from t1
    					) as a1
    				where (r >=((n-1)/4*2+1-0.75) and r<=((n-1)/4*2+1+0.75))
    		)as a2
    	group by SUBJECTNAME),
    t4 as (	select 
    			SUBJECTNAME as b,
    			round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*3+1)-min(r))+min(STATYHOUR)),2)as upperQuartitle
    		from(	select 
    				*
    				from (	select *,
    							row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
    							count(*) over(partition by SUBJECTNAME) as n
    						from t1
    					) as a1
    				where (r >=((n-1)/4*3+1-0.75) and r<=((n-1)/4*3+1+0.75))
    		)as a2
    	group by SUBJECTNAME)
    select t2.b as SUBJECTNAME,lowerQuartile,median,upperQuartitle
    from t2,t3,t4 where t2.b=t3.b and t3.b=t4.b;
    
    
    /*
    c	29.8	50.36	107.87
    c++	47.72	73.86	112.25
    db	29.18	60.29	137.41
    gauss	13.55	29.61	92.71
    java	58.96	107.58	127.41
    python	59.52	71.44	112.83
    */
    
    

    SQL执行成功啦,可是,返回的结果是否正确?
    通过结果 推算公式 编写sql以后继续验证该结果是否正确;
    这种情况下第一想到的是excel表格,突然想起来,我是一名测试,那么,是否可以尝试python的库呢?

    # 创建一个数组,查是否可以找到对应的分位数`
    # pip install numpy 安装库
    import numpy as np
    number = [1,2,3,4,5]
    z = np.percentile(number,(25,50,75), interpolation='midpoint')
    print(z)
    print(type(z))
    
    
    >> [2. 3. 4.]
    >> <class 'numpy.ndarray'>
    

    python实现校验:

    
    import numpy as np
    import pymysql
    
    calculated_value={} #存放数据库查询的分位数
    verify_calculated_value={}  #存放数据库查询的分位数
    class MySqlS():
        """创建一个类,用来校验数据库获取的上四分数,中四分数,下四分数是否一致"""
        def __init__(self):
            self.dbs = pymysql.connect(host='localhost', user='root', password='root', db='demo', port=3306)
            self.db = self.dbs.cursor()
        def __del__(self):
            self.db.close()
            self.dbs.close()
        def query_table_data(self):
            """查询要验证的sql数据,得出:科目名称(SUBJECTNAME):{科目名称(SUBJECTNAME),上四分数(lowerQuartile),中位数(median),下四分数(upperQuartitle)}}"""
            sql = """with 
                    t1 as(	select * from SUBJECT
                        where CLASSID = 9
                        ),
                    t2 as (	select 
                                SUBJECTNAME as b,
                                round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*1+1)-min(r))+min(STATYHOUR)),2)as lowerQuartile
                            from(	select 
                                    *
                                    from (	select *,
                                                row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
                                                count(*) over(partition by SUBJECTNAME) as n
                                            from t1
                                        ) as a1
                                    where r >=((n-1)/4*1+1-0.75) and r<=((n-1)/4*1+1+0.75) 
                            )as t2
                        group by SUBJECTNAME),
                    t3 as (	select 
                                SUBJECTNAME as b,
                                round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*2+1)-min(r))+min(STATYHOUR)),2)as median
                            from(	select 
                                    *
                                    from (	select *,
                                                row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
                                                count(*) over(partition by SUBJECTNAME) as n
                                            from t1
                                        ) as a1
                                    where (r >=((n-1)/4*2+1-0.75) and r<=((n-1)/4*2+1+0.75))
                            )as t2
                        group by SUBJECTNAME),
                    t4 as (	select 
                                SUBJECTNAME as b,
                                round(((max(STATYHOUR)-min(STATYHOUR))*(((max(n)-1)/4*3+1)-min(r))+min(STATYHOUR)),2)as upperQuartitle
                            from(	select 
                                    *
                                    from (	select *,
                                                row_number() over(partition by SUBJECTNAME order by STATYHOUR) as r,
                                                count(*) over(partition by SUBJECTNAME) as n
                                            from t1
                                        ) as a1
                                    where (r >=((n-1)/4*3+1-0.75) and r<=((n-1)/4*3+1+0.75))
                            )as t2
                        group by SUBJECTNAME)
                    select t2.b as SUBJECTNAME,lowerQuartile,median,upperQuartitle
                    from t2,t3,t4 where t2.b=t3.b and t3.b=t4.b;
                    """
            self.db.execute(sql)
            temp_val_1 = self.db.fetchall()
            for i in temp_val_1:
                calculated_value_temp = {i[0]:{ "SUBJECTNAME":i[0],"lowerQuartile":i[1],"median":i[2],"upperQuartitle":i[3]}}
                calculated_value.update(calculated_value_temp)
        def query_sql_data(self):
            """ 查询验证的数值,得出 {科目名称(SUBJECTNAME}:{科目名称(SUBJECTNAME),上四分数(lowerQuartile),中位数(median),下四分数(upperQuartitle)}}"""
            for SUBJECTNAME in calculated_value.keys():
                sql = "select STATYHOUR from SUBJECT where CLASSID = 9 and SUBJECTNAME = '{0}'order by STATYHOUR asc;".format(SUBJECTNAME)
                self.db.execute(sql)
                temp_val_1 = self.db.fetchall()
                SUBJECTNAMES = []
                for i in temp_val_1:
                    SUBJECTNAMES +=list(i)
                z = np.percentile(SUBJECTNAMES, (25, 50, 75), interpolation='midpoint')
                lowerQuartile = round(z[0],2)
                median = round(z[1],2)
                upperQuartitle = round(z[2],2)
                verify_calculated_value_temps =  {SUBJECTNAME :{"SUBJECTNAME":SUBJECTNAME,"lowerQuartile":lowerQuartile,"median":median,"upperQuartitle":upperQuartitle}}
                verify_calculated_value.update(verify_calculated_value_temps)
        def verify_sql_data(self):
            """校验数据"""
            for SUBJECTNAME in calculated_value.keys():
                try:
                    assert calculated_value.get(SUBJECTNAME).get('lowerQuartile')==verify_calculated_value.get(SUBJECTNAME).get('lowerQuartile'),\
                        '{0}=={1}报错\t{2}'.format(calculated_value.get(SUBJECTNAME).get('lowerQuartile'),verify_calculated_value.get(SUBJECTNAME).get('lowerQuartile'),(calculated_value.get(SUBJECTNAME),verify_calculated_value.get(SUBJECTNAME)))
                    assert calculated_value.get(SUBJECTNAME).get('median')==verify_calculated_value.get(SUBJECTNAME).get('median'),\
                        '{0}=={1}报错\t{2}'.format(calculated_value.get(SUBJECTNAME).get('median'),verify_calculated_value.get(SUBJECTNAME).get('median'),(calculated_value.get(SUBJECTNAME),verify_calculated_value.get(SUBJECTNAME)))
                    assert calculated_value.get(SUBJECTNAME).get('upperQuartitle')==verify_calculated_value.get(SUBJECTNAME).get('upperQuartitle'),\
                        '{0}=={1}报错\t{2}'.format(calculated_value.get(SUBJECTNAME).get('upperQuartitle'),verify_calculated_value.get(SUBJECTNAME).get('upperQuartitle'),(calculated_value.get(SUBJECTNAME),verify_calculated_value.get(SUBJECTNAME)))
                except AssertionError as err:
                    print(err)
    if __name__ == '__main__':
        MySqlS().query_table_data()
        MySqlS().query_sql_data()
        MySqlS().verify_sql_data()
    
    
    >> 47.72==44.49报错	({'SUBJECTNAME': 'c++', 'lowerQuartile': 47.72, 'median': 73.86, 'upperQuartitle': 112.25}, {'SUBJECTNAME': 'c++', 'lowerQuartile': 44.49, 'median': 73.86, 'upperQuartitle': 112.65})
    >> 13.55==14.71报错	({'SUBJECTNAME': 'gauss', 'lowerQuartile': 13.55, 'median': 29.61, 'upperQuartitle': 92.71}, {'SUBJECTNAME': 'gauss', 'lowerQuartile': 14.71, 'median': 29.62, 'upperQuartitle': 81.44})
    >> 59.52==59.53报错	({'SUBJECTNAME': 'python', 'lowerQuartile': 59.52, 'median': 71.44, 'upperQuartitle': 112.83}, {'SUBJECTNAME': 'python', 'lowerQuartile': 59.53, 'median': 71.44, 'upperQuartitle': 112.83})
    
    

    ok,执行,然后,断言出错了:

    执行sql,分别找出这几条数据:

    select STATYHOUR from SUBJECT where CLASSID = 9 and SUBJECTNAME= 'c++' order by STATYHOUR asc;
    select STATYHOUR from SUBJECT where CLASSID = 9 and SUBJECTNAME= 'gauss' order by STATYHOUR asc;
    select STATYHOUR from SUBJECT where CLASSID = 9 and SUBJECTNAME= 'python' order by STATYHOUR asc;
    

    数据粘贴到excel:
    在这里插入图片描述

    得到的中位数和我执行查询到的中位数是 一致的,把数据粘贴到python里,查询中

    import numpy as np
    c = [21.86,38.03,50.95,72.3,75.42,111.86,113.43,147.58,21.86,38.03,50.95,72.3,75.42,111.86,113.43,147.58]
    gauss=[1.59,3.52,12.4,17.01,20.29,38.94,58.88,103.99,144.65,144.93]
    python = [16.74,19.82,59.21,59.84,66.57,71.44,87.05,111.84,113.82,122.19,123.31]
    c_lowerQuartile = np.percentile(c,(25), interpolation='midpoint')
    gauss_lowerQuartile =np.percentile(gauss,(25), interpolation='midpoint')
    python_lowerQuartile = np.percentile(python,(25), interpolation='midpoint')
    
    print(c_lowerQuartile)
    print(gauss_lowerQuartile)
    print(python_lowerQuartile)
    
    
    >> 44.49
    >> 14.705000000000002
    >> 59.525000000000006
    

    现在得到的问题是,得到的上四分数,
    excel算出来的和python(numpy )算出来的数值不一致;

    暂时推测:
    excel上四分 = (模拟数据(最大值)-模拟数(最小值))×(R-最小行号)+模拟数最小值

    python上四分 = (模拟数据(最大值)+模拟数(最小值))*(R-最小行号)
    两个公式下得到的结果不一致,
    细推,我的数据不止这三组,其他的数据为什么断言就成功了,找出成功的数据,试试规则;
    在这里插入图片描述
    在计算上次执行成功的数据的时候,遇到了一个新问题,第二次执行断言测试,班级java也出现了断言失败;错误数由上次的三个变成了4个。

    
    
    >> 47.72==44.49报错	({'SUBJECTNAME': 'c++', 'lowerQuartile': 47.72, 'median': 73.86, 'upperQuartitle': 112.25}, {'SUBJECTNAME': 'c++', 'lowerQuartile': 44.49, 'median': 73.86, 'upperQuartitle': 112.65})
    >> 13.55==14.71报错	({'SUBJECTNAME': 'gauss', 'lowerQuartile': 13.55, 'median': 29.61, 'upperQuartitle': 92.71}, {'SUBJECTNAME': 'gauss', 'lowerQuartile': 14.71, 'median': 29.62, 'upperQuartitle': 81.44})
    >> 58.96==58.22报错	({'SUBJECTNAME': 'java', 'lowerQuartile': 58.96, 'median': 107.58, 'upperQuartitle': 127.41}, {'SUBJECTNAME': 'java', 'lowerQuartile': 58.22, 'median': 107.58, 'upperQuartitle': 128.8})
    >> 59.52==59.53报错	({'SUBJECTNAME': 'python', 'lowerQuartile': 59.52, 'median': 71.44, 'upperQuartitle': 112.83}, {'SUBJECTNAME': 'python', 'lowerQuartile': 59.53, 'median': 71.44, 'upperQuartitle': 112.83})
    
    

    简单输入

    z = [1,2,3,4,5,6]
    x= np.percentile(z,(25), interpolation='midpoint')
    print(x)
    
    
    >> 2.5
    进程已结束,退出代码为 0
    

    这里实际的上四分口算应该是2.25
    这种情况下暂时定义excel的结果是正确的,本人编写的sql找到的结果是正确的。
    后续再查找numpy库的逻辑,看看这个区别在哪里

    展开全文
  • python计算四分位及绘制箱型图

    千次阅读 2021-02-18 13:35:46
    一、计算四分位 #!/usr/bin/python # -*- coding: UTF-8 -*- """ @author:ZSW @file:quantile_distance.py @time:2021/02/05 """ import pandas as pd import numpy as np # 读取excle文件 excel_data = pd.read...

    一、计算四分位

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    """
    @author:ZSW
    @file:quantile_distance.py
    @time:2021/02/05
    """
    
    import pandas as pd
    import numpy as np
    
    # 读取excle文件
    excel_data = pd.read_excel("1.xlsx")
    # print(excel_data)
    
    data1 = excel_data.to_dict(orient="list")
    data_list = data1['time']
    data_list = sorted(data_list)
    
    # 法一:使用numpy工具包
    res = np.percentile(data_list, (25, 50, 75), interpolation='midpoint')
    print(res)
    
    
    # 法二:直接计算
    def median(x):
        x = sorted(x)
        length = len(x)
        mid, rem = divmod(length, 2)  # divmod函数返回商和余数
        if rem:
            return x[:mid], x[mid + 1:], x[mid]
        else:
            return x[:mid], x[mid:], (x[mid - 1] + x[mid]) / 2
    
    
    lHalf, rHalf, q2 = median(data_list)
    print('上四分位:{}'.format(median(lHalf)[2]))
    print('中位数:{}'.format(q2))
    print('下四分位:{}'.format(median(rHalf)[2]))
    print('四分位距:{}'.format(median(rHalf)[2]-median(lHalf)[2]))
    res = (median(rHalf)[2]-median(lHalf)[2])*1.5 + median(rHalf)[2]
    print('异常阈值:{}'.format(res))
    
    # 法三:使用pandas中describe()函数
    print(pd.DataFrame(data_list).describe())

    结果:

    [0.12638889 0.59694444 2.32527778]
    上四分位:0.126388888888889
    中位数:0.596944444444444
    下四分位:2.3252777777777798
    四分位距:2.1988888888888907
    异常阈值:5.623611111111115
    
                      0
    count  37932.000000
    mean       3.041283
    std        5.612899
    min        0.000000
    25%        0.126389
    50%        0.596944
    75%        2.325139
    max       25.071944

    二、绘制箱型图

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    """
    @author:ZSW
    @file:plot_quantile_distance.py
    @time:2021/02/05
    """
    
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    # 解决matplotlib无法显示中文问题
    mpl.rcParams["font.sans-serif"] = ["SimHei"]
    mpl.rcParams["axes.unicode_minus"] = False
    
    
    df = pd.read_excel("1.xlsx")
    
    data = df['avg_time']
    data.plot.box(title="箱型图")
    plt.show()

                                                                                                 

                                                                                                        

    三、绘制多箱型图

    import pandas as pd
    from pylab import *
    
    rcParams['axes.unicode_minus'] = False
    rcParams['font.sans-serif'] = ['Simhei']
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet1')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['A类']
    labels = '1'
    plt.subplot(241)
    plt.boxplot([box_1], notch=False, labels=labels, patch_artist = False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color':'black','linewidth':'2.0'})
    plt.xlabel("A类", fontsize=16)
    plt.ylabel('时长(时)', fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet2')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['B类']
    labels = '2'
    plt.subplot(242)
    plt.boxplot([box_1], notch=False, labels=labels, patch_artist=False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color': 'black', 'linewidth':'2.0'})
    plt.xlabel("B类",fontsize=16)
    plt.ylabel('时长(时)',fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet3')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['C类']
    labels = '3'
    plt.subplot(243)
    plt.boxplot([box_1], notch=False, labels=labels, patch_artist=False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color':'black','linewidth':'2.0'})
    plt.xlabel("C类",fontsize=16)
    plt.ylabel('时长(时)',fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet4')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['D类']
    labels = '4'
    plt.subplot(244)
    plt.boxplot([box_1], notch=False, labels=labels,patch_artist=False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color':'black','linewidth':'2.0'})
    plt.xlabel("D类",fontsize=16)
    plt.ylabel('时长(时)',fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet5')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['E类']
    labels = '5'
    plt.subplot(245)
    plt.boxplot([box_1], notch=False, labels=labels, patch_artist=False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color':'black','linewidth':'2.0'})
    plt.xlabel("E类",fontsize=16)
    plt.ylabel('时长(时)',fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet6')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['F类']
    labels = '6'
    plt.subplot(246)
    plt.boxplot([box_1], notch=False, labels=labels, patch_artist=False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color':'black','linewidth':'2.0'})
    plt.xlabel("F类",fontsize=16)
    plt.ylabel('时长(时)',fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    
    df = pd.read_excel("5.xlsx", sheet_name='Sheet7')
    data1 = df.to_dict(orient="list")
    df = pd.DataFrame(data1)
    print(df.describe())  # 显示中位数、上下四分位数、标准偏差等内容
    box_1 = data1['G类']
    labels = '8'
    plt.subplot(247)
    plt.boxplot([box_1], notch=False, labels=labels, patch_artist=False, boxprops={'color':'black','linewidth':'2.0'},
                capprops={'color':'black','linewidth':'2.0'})
    plt.xlabel("G类",fontsize=16)
    plt.ylabel('时长(时)',fontsize=16)
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    plt.show()

    结果:

                                       

        

    参考:http://www.79tui.com/happy/605215.html

             https://blog.csdn.net/sinat_28252525/article/details/80671238

            https://blog.csdn.net/qq_27217709/article/details/89483025

    展开全文
  • 四分位数的数学计算以及使用pandas计算前言参考举例1(奇数个)第一四分位数(下四分位数)中位数第三四分位数(上四分位数)举例2(偶数个)第一四分位数(下四分位数)中位数第三四分位数(上四分位数) ...
  • Python清除异常值四分位法

    万次阅读 2019-06-13 12:55:44
    同理,第一四分位数、第三四分位数是按从小到大的顺序排序后,处于25%、75%的数字。 令 IQR=Q3−Q1IQR=Q3−Q1 ,那么 Q3+1.5(IQR)Q3+1.5(IQR) 和 Q1−1.5(IQR)Q1−1.5(IQR) 之间的值就是可接受范围内的数值,这两...
  • 第三步:绘制箱线图的上下范围,上限为上四分位数,下限为下四分位数。在箱子内部中位数的位置绘制横线。 第四步:大于上四分位数1.5倍四分位数差的值,或者小于下四分位数1.5倍四分位数差的值,划为异常值。 第五步...
  • 20211115 当有空值存在时,四分位数会是空值 20211019 https://www.zhihu.com/question/58421946 https://baike.baidu.com/item/%E5%9B%9B%E5%88%86%E4%BD%8D%E6%95%B0/5040599?fr=aladdin 上四分位数是大的那端 ...
  • pandas-task04.md

    2020-12-25 22:34:44
    四分位数(quantile)是中位数的延申,quantile(0.25),quantile(0.5),quantile(0.75)分别是三个分位点 2.分组的本质-按条件列表中元素的值的组合来分组(数据来源组合的unique值) 多属性分组 传入多属性组成的列表...
  • 请根据上下四分位数分割,将体重分为 high、normal、low 三组,统计身高的均值。 df['core'] = pd.cut(df['Weight'],[0,df.Weight.quantile(0.25),df.Weight.quantile(0.75),df.Weight.max()],labels=['low','normal...
  • 一、在分享今天的内容之前,我们先来简单了解下关于数学中的部分统计学及概率的知识...其次,如下图中所示的:分位数、中位数、众数等; 再者,就是今天要重点介绍的箱型图,如下图所示 待会要分享的Pytho......
  • 【pandas04】分组

    千次阅读 2020-12-24 21:15:15
    请根据上下四分位数分割,将体重分为high、normal、low三组,统计身高的均值。 计算三分位的边界在哪里 weight_tertile = list(df.Weight.quantile([.33, .66])) 确定分组依据 我们可以写一个function去把Weight...
  • 目录1. 描述性统计概念2. 利用NumPy和SciPy进行数值分析3. 利用Matplotlib进行可视化4. 总结5. 参考资料1 描述性统计概念描述性统计...利用Python中的NumPy和SciPy工具可对数据集进行数值分析,而Matplotlib可用来绘...
  • df.Weight.mean() 然后将其传入groupby中: df.groupby(condition)['Height'].mean() Weight False 159.034646 True 172.705357 Name: Height, dtype: float64 【练一练】 请根据上下四分位数分割,将体重分为high、...
  • 在矩形的上下边各延伸出一条线,每条线的长度一般为1.5倍四分位距(四分位距即上下四分位数之差),这两条先被视为异常值的截断线,上端的线为上边缘线,下端的线为下边缘线。线外的点一般被认为是异常值。 箱线图...
  • Python Matplotlib绘图

    2020-08-12 11:25:18
    五个重要数值 最大值 最小值 中位数 下四分位数四分位数 通过 plt.boxplot() 方法绘制 ply.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,labels=None,meanline=None,...
  • 箱形图以及python实践

    2020-11-29 03:26:53
    最近在接触kaggle的竞赛示例,练习了一下,感觉受益匪浅。同时,心中也有个问题。拿到数据之后第一件事是什么...在python中又是如何实现的呢?于是我今天翻开了贾俊平老师的那本《统计学》琢磨了一下午,又参考了各...
  • 2021-02-08

    2021-02-08 14:23:27
    描述数据集常用4个指标:平均值 四分位数 标准差 标准分,利用这些指标可以进行数据的频数分析、数据的集中趋势分析、数据离散程度分析、数据的分布、以及一些基本的统计图形。 通常我们拿到一份数据集,首先对获取...
  • 检测异常值的方式有很多,最基本的两种方法为 z 分数法和上下截断点法。本文即使 效果展示(Jupyter notebook) 一行代码快速绘图查看房价分布情况 如何一步到位的画出复杂精美的图片可以参考这篇博文 Python 数据...
  • 位数和箱线图

    千次阅读 2019-05-30 21:10:20
    简单说就是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。 Q1-数据中有25%个数据都比它小,第一分位数 Q2-中位数 Q3-数据中有75%个数据都比它小,第三...
  • 小编今天跟大家分享的就是python数据清洗中的噪声数据,对于这些噪声数据我们应该怎样检测和处理呢?下面跟小编一起来看吧。一、什么是噪声数据噪声数据Noisy Data,噪声值,指的是数据中存在着一个或中者几个错误的...
  • 概念箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分别为数据的...
  • 利用箱线图对数据分布做一个简单的统计可视化,利用数据集的上下四分位数(Q1和Q3)、中点等形成。异常点常被定义为小于Q1-1.5IQR或大于Q3+1.5IQR的那些数据。 参考资料:DataWhale组队学习资料 ...
  • quantile:指定盖帽法的上下位数范围 """ # 生成分位数 Q01,Q99=x.quantile(quantile).values.tolist() # 替换异常值为指定的分位数 if Q01 > x.min(): x = x.copy() x.loc[x] = Q01 if Q99 (): x = x....
  • 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给...
  • ( Q3 + 1.5 * IQR ) 这种探测离群点的方法,是箱线图默认的方法,箱线图提供了识别异常值/离群点的一个标准: 异常值通常被定义为小于 QL- l.5 IQR 或者 大于 Qu+ 1.5 IQR的值,QL称为下四分位数, Qu称为上四分位数...
  • 首先应该先写出分组条件: 【练一练1】 请根据上下四分位数分割,将体重分为high、normal、low三组,统计身高的均值。 【解答】 df_copy=df.copy() df_copy['group_Weight']=df['Weight'].mask(df['Weight']>=df['...
  • 概念箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分别为数据的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,091
精华内容 436
热门标签
关键字:

python求上下四分位数