如何让Postgres与Pandas的百分位计算结果匹配?
Postgres percentile_cont与Pandas quantile百分位计算结果不一致排查
背景
我需要验证Postgres与Pandas的百分位计算结果一致性,目标是25th、50th、75th百分位,Postgres使用percentile_cont()函数(统计场景需求),但两者75th百分位结果始终不匹配。
Postgres实现与结果
SQL查询语句:
SELECT percentile_cont(0.25) WITHIN GROUP (order by obs1) as q1 , percentile_cont(0.5) WITHIN GROUP (order by obs1) as med , percentile_cont(0.75) WITHIN GROUP (order by obs1) as q3 FROM my_table;
返回结果:q1=73.99,med=74.0,q3=74.0085
Pandas实现与结果
已按照资料设置interpolation='linear'以匹配Postgres的线性插值逻辑:
import pandas as pd dataframe = pd.read_sql(sql='SELECT obs1 FROM my_table', con='my_connection_info') dataframe = dataframe.sort_values(by='obs1') percentiles = dataframe.quantile(q=[0.25, 0.5, 0.75], axis=0, numeric_only=False, interpolation='linear', method='single')
计算结果:
obs1 0.25 73.992 0.50 74.000 0.75 74.006
已完成的排查步骤
- 给Postgres查询结果添加
::numeric转换,结果无变化 - 确认数据库中
obs1列数据类型为float8 - 验证两边使用的数据集均为25条记录
- 因业务需求必须使用
percentile_cont(),测试percentile_disc()得到74.009,仍与Pandas结果不符 - q1、q2结果匹配,说明两边排序逻辑一致
手动计算疑问
25条排序后的数据,75th百分位对应位置为25*0.75=18.75,第18、19位的值均为74.006,完全无法理解Postgres得出的74.0085是如何计算的,也不知道如何调整让两者结果匹配以完成验证。
完整排序数据集
obs1 24 73.982 12 73.983 18 73.984 7 73.985 2 73.988 20 73.988 4 73.992 10 73.994 16 73.994 1 73.995 6 73.995 9 73.998 15 74.000 19 74.000 3 74.002 11 74.004 21 74.004 13 74.006 17 74.006 8 74.008 5 74.009 22 74.010 14 74.012 23 74.015 0 74.030
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

