Skip to content

Commit 2431425

Browse files
committed
Merge pull request #11352 from chris-b1/excel-infcheck
PERF: fast inf checking in to_excel
2 parents 03b131a + c5c44e8 commit 2431425

File tree

5 files changed

+31
-3
lines changed

5 files changed

+31
-3
lines changed

asv_bench/asv.conf.json

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"numexpr": [],
4444
"pytables": [],
4545
"openpyxl": [],
46+
"xlsxwriter": [],
4647
"xlrd": [],
4748
"xlwt": []
4849
},

doc/source/whatsnew/v0.17.1.txt

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ Performance Improvements
6262
- Release the GIL on most datetime field operations (e.g. ``DatetimeIndex.year``, ``Series.dt.year``), normalization, and conversion to and from ``Period``, ``DatetimeIndex.to_period`` and ``PeriodIndex.to_timestamp`` (:issue:`11263`)
6363

6464

65+
- Improved performance to ``to_excel`` (:issue:`11352`)
66+
6567
.. _whatsnew_0171.bug_fixes:
6668

6769
Bug Fixes

pandas/core/format.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1708,9 +1708,9 @@ def _format_value(self, val):
17081708
if lib.checknull(val):
17091709
val = self.na_rep
17101710
elif com.is_float(val):
1711-
if np.isposinf(val):
1711+
if lib.isposinf_scalar(val):
17121712
val = self.inf_rep
1713-
elif np.isneginf(val):
1713+
elif lib.isneginf_scalar(val):
17141714
val = '-%s' % self.inf_rep
17151715
elif self.float_format is not None:
17161716
val = float(self.float_format % val)

pandas/lib.pyx

+12
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,18 @@ cpdef checknull_old(object val):
269269
else:
270270
return util._checknull(val)
271271

272+
cpdef isposinf_scalar(object val):
273+
if util.is_float_object(val) and val == INF:
274+
return True
275+
else:
276+
return False
277+
278+
cpdef isneginf_scalar(object val):
279+
if util.is_float_object(val) and val == NEGINF:
280+
return True
281+
else:
282+
return False
283+
272284
def isscalar(object val):
273285
"""
274286
Return True if given value is scalar.

pandas/tests/test_lib.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,19 @@ def test_maybe_indices_to_slice_middle(self):
161161
self.assert_numpy_array_equal(maybe_slice, indices)
162162
self.assert_numpy_array_equal(target[indices], target[maybe_slice])
163163

164+
def test_isinf_scalar(self):
165+
#GH 11352
166+
self.assertTrue(lib.isposinf_scalar(float('inf')))
167+
self.assertTrue(lib.isposinf_scalar(np.inf))
168+
self.assertFalse(lib.isposinf_scalar(-np.inf))
169+
self.assertFalse(lib.isposinf_scalar(1))
170+
self.assertFalse(lib.isposinf_scalar('a'))
171+
172+
self.assertTrue(lib.isneginf_scalar(float('-inf')))
173+
self.assertTrue(lib.isneginf_scalar(-np.inf))
174+
self.assertFalse(lib.isneginf_scalar(np.inf))
175+
self.assertFalse(lib.isneginf_scalar(1))
176+
self.assertFalse(lib.isneginf_scalar('a'))
164177

165178
class Testisscalar(tm.TestCase):
166179

@@ -232,4 +245,4 @@ def test_lisscalar_pandas_containers(self):
232245
import nose
233246

234247
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
235-
exit=False)
248+
exit=False)

0 commit comments

Comments
 (0)