Changeset: 1ceddbfc2c74 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1ceddbfc2c74 Modified Files: gdk/ChangeLog gdk/gdk_aggr.c sql/test/quantiles/Tests/quantiles.stable.out Branch: default Log Message:
Round quantile position down to nearest integer. I.e., 1.5 is rounded down to 1, 1.51 is rounded to 2 (nearer than 1). diffs (169 lines): diff --git a/gdk/ChangeLog b/gdk/ChangeLog --- a/gdk/ChangeLog +++ b/gdk/ChangeLog @@ -1,6 +1,12 @@ # ChangeLog file for MonetDB # This file is updated with Maddlog +* Fri Feb 17 2017 Sjoerd Mullender <[email protected]> +- Quantiles calculate a position in the sorted column. If this position + is not an integer, we now choose the nearest position, favoring the + lower if the distance to the two adjacent positions is equal (round + down to nearest integer). + * Mon Jan 30 2017 Sjoerd Mullender <[email protected]> - Removed function BATprintf. Use BATprint or BATprintcolumns instead. - Removed BATsave from the list of exported functions. diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -2490,7 +2490,8 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e, v = nil; nils++; } else { - qindex = (BUN) (r + (p-r-1) * quantile); + /* round *down* to nearest integer */ + qindex = r + p - (BUN) (p + 0.5 - (p - r - 1) * quantile); /* be a little paranoid about the index */ assert(qindex >= r); assert(qindex < p); @@ -2516,7 +2517,7 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e, while (r < p && (*atomcmp)(BUNtail(bi, r), nil) == 0) r++; } - index = (BUN) (r + (p-r-1) * quantile); + index = r + p - (BUN) (p + 0.5 - (p - r - 1) * quantile); v = BUNtail(bi, index); if (BUNappend(bn, v, FALSE) != GDK_SUCCEED) goto bunins_failed; diff --git a/sql/test/quantiles/Tests/quantiles.stable.out b/sql/test/quantiles/Tests/quantiles.stable.out --- a/sql/test/quantiles/Tests/quantiles.stable.out +++ b/sql/test/quantiles/Tests/quantiles.stable.out @@ -94,98 +94,98 @@ Ready. #7532.30 "A" [ 10000 ] #select quantile(l_extendedprice,0.5) from lit; -% sys.L1 # table_name -% L1 # name +% sys.L4 # table_name +% L3 # name % decimal # type % 20 # length [ 36724.500 ] #select median(l_extendedprice) from lit; -% sys.L1 # table_name -% L1 # name +% sys.L4 # table_name +% L3 # name % decimal # type % 20 # length [ 36724.50 ] #select quantile(l_extendedprice,0.0) from lit; -% sys.L1 # table_name -% L1 # name +% sys.L4 # table_name +% L3 # name % decimal # type % 20 # length [ 947.020 ] #select quantile(l_extendedprice,1.0) from lit; -% sys.L1 # table_name -% L1 # name +% sys.L4 # table_name +% L3 # name % decimal # type % 20 # length [ 103149.000 ] #select quantile(l_extendedprice,0.05),quantile(l_extendedprice,0.5),quantile(l_extendedprice,0.95) from lit; -% sys.L1, sys.L2, sys.L3 # table_name -% L1, L2, L3 # name +% sys.L4, sys.L7, sys.L12 # table_name +% L3, L6, L11 # name % decimal, decimal, decimal # type % 20, 20, 20 # length -[ 4171.320, 36724.500, 79584.120 ] +[ 4200.320, 36724.500, 79584.120 ] #select quantile(l_extendedprice,1) from lit; -% sys.L1 # table_name -% L1 # name +% sys.L4 # table_name +% L3 # name % decimal # type % 20 # length [ 103149.000 ] #select quantile(l_extendedprice,0) from lit; -% sys.L1 # table_name -% L1 # name +% sys.L4 # table_name +% L3 # name % decimal # type % 20 # length [ 947.020 ] #select quantile(l_extendedprice,0.5) from lit group by l_returnflag; -% sys.L1 # table_name -% L1 # name +% sys.L3 # table_name +% L2 # name % decimal # type % 20 # length [ 36960.680 ] [ 37144.200 ] [ 35937.880 ] #select median(l_extendedprice) from lit group by l_returnflag; -% sys.L1 # table_name -% L1 # name +% sys.L3 # table_name +% L2 # name % decimal # type % 20 # length [ 36960.68 ] [ 37144.20 ] [ 35937.88 ] #select quantile(l_extendedprice,0.0) from lit group by l_returnflag; -% sys.L1 # table_name -% L1 # name +% sys.L3 # table_name +% L2 # name % decimal # type % 20 # length [ 947.020 ] [ 1027.010 ] [ 1012.090 ] #select quantile(l_extendedprice,1.0) from lit group by l_returnflag; -% sys.L1 # table_name -% L1 # name +% sys.L3 # table_name +% L2 # name % decimal # type % 20 # length [ 103149.000 ] [ 100248.500 ] [ 101896.500 ] #select quantile(l_extendedprice,0.05),quantile(l_extendedprice,0.5),quantile(l_extendedprice,0.95) from lit group by l_returnflag; -% sys.L1, sys.L2, sys.L3 # table_name -% L1, L2, L3 # name +% sys.L3, sys.L6, sys.L11 # table_name +% L2, L5, L10 # name % decimal, decimal, decimal # type % 20, 20, 20 # length [ 4424.440, 36960.680, 80045.910 ] [ 3885.880, 37144.200, 79010.100 ] [ 4171.320, 35937.880, 78572.760 ] #select quantile(l_extendedprice,1) from lit group by l_returnflag; -% sys.L1 # table_name -% L1 # name +% sys.L3 # table_name +% L2 # name % decimal # type % 20 # length [ 103149.000 ] [ 100248.500 ] [ 101896.500 ] #select quantile(l_extendedprice,0) from lit group by l_returnflag; -% sys.L1 # table_name -% L1 # name +% sys.L3 # table_name +% L2 # name % decimal # type % 20 # length [ 947.020 ] _______________________________________________ checkin-list mailing list [email protected] https://www.monetdb.org/mailman/listinfo/checkin-list
