From 025de9d4ecd3650807f96a47165ec89eff4878e8 Mon Sep 17 00:00:00 2001 From: Tomaz Berisa Date: Fri, 3 Apr 2015 16:12:44 -0400 Subject: [PATCH 1/5] BUG: Fix for #9764 Values from range [1e-7, 5e-7] (for display.precision=7) not displaying 0 anymore --- pandas/core/format.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/format.py b/pandas/core/format.py index b21ca9050ffd0..7b8a3161b5e05 100644 --- a/pandas/core/format.py +++ b/pandas/core/format.py @@ -1996,7 +1996,7 @@ def _format_strings(self): # this is pretty arbitrary for now has_large_values = (abs_vals > 1e8).any() - has_small_values = ((abs_vals < 10 ** (-self.digits)) & + has_small_values = ((abs_vals < 10 ** (-self.digits+1)) & (abs_vals > 0)).any() if too_long and has_large_values: From e375dd7c32abcb4af4c4c368492a52c468ad1453 Mon Sep 17 00:00:00 2001 From: Tomaz Berisa Date: Fri, 3 Apr 2015 17:29:56 -0400 Subject: [PATCH 2/5] TST: Test for #9764 fix --- pandas/tests/test_format.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pandas/tests/test_format.py b/pandas/tests/test_format.py index ce32c8af99a73..145fa78b387cd 100644 --- a/pandas/tests/test_format.py +++ b/pandas/tests/test_format.py @@ -2986,6 +2986,20 @@ def test_format(self): self.assertEqual(result[0], " 12") self.assertEqual(result[1], " 0") + def test_output_significant_digits(self): + # relevant to issue #9764 + d=pd.DataFrame({'col1':[9.999e-8, 1e-7, 1.0001e-7, 2e-7, 4.999e-7, 5e-7, 5.0001e-7, 6e-7, 9.999e-7, 1e-6, 1.0001e-6, 2e-6, 4.999e-6, 5e-6, 5.0001e-6, 6e-6]}) + + expected_output={ + (0,6):' col1\n0 9.999000e-08\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07', + (1,6):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07', + (1,8):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07\n6 5.000100e-07\n7 6.000000e-07', + (8,16):' col1\n8 9.999000e-07\n9 1.000000e-06\n10 1.000100e-06\n11 2.000000e-06\n12 4.999000e-06\n13 5.000000e-06\n14 5.000100e-06\n15 6.000000e-06', + (9,16):' col1\n9 0.000001\n10 0.000001\n11 0.000002\n12 0.000005\n13 0.000005\n14 0.000005\n15 0.000006' + } + + for k, v in expected_output.items(): + self.assertEqual(d[k[0]:k[1]].__str__(), v) class TestRepr_timedelta64(tm.TestCase): From 86a1404cb41ab1d8bd070fcc16e8c1eafa6909b5 Mon Sep 17 00:00:00 2001 From: Tomaz Berisa Date: Fri, 3 Apr 2015 17:48:38 -0400 Subject: [PATCH 3/5] TST: Test saves and restore context (#9764) --- pandas/tests/test_format.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pandas/tests/test_format.py b/pandas/tests/test_format.py index 145fa78b387cd..e3f458690d5f7 100644 --- a/pandas/tests/test_format.py +++ b/pandas/tests/test_format.py @@ -2987,7 +2987,13 @@ def test_format(self): self.assertEqual(result[1], " 0") def test_output_significant_digits(self): - # relevant to issue #9764 + # Issue #9764 + + # In case default display precision changes: + saved_option=pd.get_option('display.precision') + pd.set_option('display.precision', 7) + + # DataFrame from issue #9764 d=pd.DataFrame({'col1':[9.999e-8, 1e-7, 1.0001e-7, 2e-7, 4.999e-7, 5e-7, 5.0001e-7, 6e-7, 9.999e-7, 1e-6, 1.0001e-6, 2e-6, 4.999e-6, 5e-6, 5.0001e-6, 6e-6]}) expected_output={ @@ -3001,6 +3007,9 @@ def test_output_significant_digits(self): for k, v in expected_output.items(): self.assertEqual(d[k[0]:k[1]].__str__(), v) + # Restore precision + pd.set_option('display.precision', saved_option) + class TestRepr_timedelta64(tm.TestCase): def test_none(self): From 7857c4348d46ea92e2e7dcf5b9d03d91855f8117 Mon Sep 17 00:00:00 2001 From: Tomaz Berisa Date: Sat, 4 Apr 2015 17:39:59 -0400 Subject: [PATCH 4/5] CLN: Test code cleanup (#9764) --- pandas/tests/test_format.py | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/pandas/tests/test_format.py b/pandas/tests/test_format.py index e3f458690d5f7..1dcdbf12a6b59 100644 --- a/pandas/tests/test_format.py +++ b/pandas/tests/test_format.py @@ -2990,25 +2990,21 @@ def test_output_significant_digits(self): # Issue #9764 # In case default display precision changes: - saved_option=pd.get_option('display.precision') - pd.set_option('display.precision', 7) + with pd.option_context('display.precision', 7): + # DataFrame example from issue #9764 + d=pd.DataFrame({'col1':[9.999e-8, 1e-7, 1.0001e-7, 2e-7, 4.999e-7, 5e-7, 5.0001e-7, 6e-7, 9.999e-7, 1e-6, 1.0001e-6, 2e-6, 4.999e-6, 5e-6, 5.0001e-6, 6e-6]}) + + expected_output={ + (0,6):' col1\n0 9.999000e-08\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07', + (1,6):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07', + (1,8):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07\n6 5.000100e-07\n7 6.000000e-07', + (8,16):' col1\n8 9.999000e-07\n9 1.000000e-06\n10 1.000100e-06\n11 2.000000e-06\n12 4.999000e-06\n13 5.000000e-06\n14 5.000100e-06\n15 6.000000e-06', + (9,16):' col1\n9 0.000001\n10 0.000001\n11 0.000002\n12 0.000005\n13 0.000005\n14 0.000005\n15 0.000006' + } + + for (start, stop), v in expected_output.items(): + self.assertEqual(str(d[start:stop]), v) - # DataFrame from issue #9764 - d=pd.DataFrame({'col1':[9.999e-8, 1e-7, 1.0001e-7, 2e-7, 4.999e-7, 5e-7, 5.0001e-7, 6e-7, 9.999e-7, 1e-6, 1.0001e-6, 2e-6, 4.999e-6, 5e-6, 5.0001e-6, 6e-6]}) - - expected_output={ - (0,6):' col1\n0 9.999000e-08\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07', - (1,6):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07', - (1,8):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07\n6 5.000100e-07\n7 6.000000e-07', - (8,16):' col1\n8 9.999000e-07\n9 1.000000e-06\n10 1.000100e-06\n11 2.000000e-06\n12 4.999000e-06\n13 5.000000e-06\n14 5.000100e-06\n15 6.000000e-06', - (9,16):' col1\n9 0.000001\n10 0.000001\n11 0.000002\n12 0.000005\n13 0.000005\n14 0.000005\n15 0.000006' - } - - for k, v in expected_output.items(): - self.assertEqual(d[k[0]:k[1]].__str__(), v) - - # Restore precision - pd.set_option('display.precision', saved_option) class TestRepr_timedelta64(tm.TestCase): From ce988b417b4ca0c62b08c6ad52c80b813fad3ef4 Mon Sep 17 00:00:00 2001 From: Tomaz Berisa Date: Sat, 4 Apr 2015 17:54:32 -0400 Subject: [PATCH 5/5] DOC: Update whatsnew for 0.16.1 (#9764) --- doc/source/whatsnew/v0.16.1.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v0.16.1.txt b/doc/source/whatsnew/v0.16.1.txt index 8c49e2780ed06..6fc347cfeb273 100644 --- a/doc/source/whatsnew/v0.16.1.txt +++ b/doc/source/whatsnew/v0.16.1.txt @@ -79,3 +79,4 @@ Bug Fixes - Bug in ``Series.quantile`` on empty Series of type ``Datetime`` or ``Timedelta`` (:issue:`9675`) - Bug in ``where`` causing incorrect results when upcasting was required (:issue:`9731`) +- Bug in ``FloatArrayFormatter`` where decision boundary for displaying "small" floats in decimal format is off by one order of magnitude for a given display.precision (:issue:`9764`)