Skip to content

Commit d8dc8ee

Browse files
committed
ENH: expose ujson precise_float argument on decode
1 parent 2f44c19 commit d8dc8ee

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

pandas/io/json.py

+34-15
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ def _format_dates(self):
119119
self.obj[c] = self._format_to_date(self.obj[c])
120120

121121
def read_json(path_or_buf=None, orient=None, typ='frame', dtype=True,
122-
convert_axes=True, convert_dates=True, keep_default_dates=True, numpy=False):
122+
convert_axes=True, convert_dates=True, keep_default_dates=True,
123+
numpy=False, precise_float=False):
123124
"""
124125
Convert JSON string to pandas object
125126
@@ -187,7 +188,9 @@ def read_json(path_or_buf=None, orient=None, typ='frame', dtype=True,
187188

188189
class Parser(object):
189190

190-
def __init__(self, json, orient, dtype=True, convert_axes=True, convert_dates=True, keep_default_dates=False, numpy=False):
191+
def __init__(self, json, orient, dtype=True, convert_axes=True,
192+
convert_dates=True, keep_default_dates=False, numpy=False,
193+
precise_float=False):
191194
self.json = json
192195

193196
if orient is None:
@@ -200,6 +203,7 @@ def __init__(self, json, orient, dtype=True, convert_axes=True, convert_dates=Tr
200203
numpy = False
201204

202205
self.numpy = numpy
206+
self.precise_float = precise_float
203207
self.convert_axes = convert_axes
204208
self.convert_dates = convert_dates
205209
self.keep_default_dates = keep_default_dates
@@ -347,24 +351,30 @@ def _parse_no_numpy(self):
347351
orient = self.orient
348352
if orient == "split":
349353
decoded = dict((str(k), v)
350-
for k, v in loads(json).iteritems())
354+
for k, v in loads(
355+
json,
356+
precise_float=self.precise_float).iteritems())
351357
self.obj = Series(dtype=None, **decoded)
352358
else:
353-
self.obj = Series(loads(json), dtype=None)
359+
self.obj = Series(
360+
loads(json, precise_float=self.precise_float), dtype=None)
354361

355362
def _parse_numpy(self):
356363

357364
json = self.json
358365
orient = self.orient
359366
if orient == "split":
360-
decoded = loads(json, dtype=None, numpy=True)
367+
decoded = loads(json, dtype=None, numpy=True,
368+
precise_float=self.precise_float)
361369
decoded = dict((str(k), v) for k, v in decoded.iteritems())
362370
self.obj = Series(**decoded)
363371
elif orient == "columns" or orient == "index":
364372
self.obj = Series(*loads(json, dtype=None, numpy=True,
365-
labelled=True))
373+
labelled=True,
374+
precise_float=self.precise_float))
366375
else:
367-
self.obj = Series(loads(json, dtype=None, numpy=True))
376+
self.obj = Series(loads(json, dtype=None, numpy=True,
377+
precise_float=self.precise_float))
368378

369379
def _try_convert_types(self):
370380
if self.obj is None: return
@@ -381,34 +391,43 @@ def _parse_numpy(self):
381391
orient = self.orient
382392

383393
if orient == "columns":
384-
args = loads(json, dtype=None, numpy=True, labelled=True)
394+
args = loads(json, dtype=None, numpy=True, labelled=True,
395+
precise_float=self.precise_float)
385396
if args:
386397
args = (args[0].T, args[2], args[1])
387398
self.obj = DataFrame(*args)
388399
elif orient == "split":
389-
decoded = loads(json, dtype=None, numpy=True)
400+
decoded = loads(json, dtype=None, numpy=True,
401+
precise_float=self.precise_float)
390402
decoded = dict((str(k), v) for k, v in decoded.iteritems())
391403
self.obj = DataFrame(**decoded)
392404
elif orient == "values":
393-
self.obj = DataFrame(loads(json, dtype=None, numpy=True))
405+
self.obj = DataFrame(loads(json, dtype=None, numpy=True,
406+
precise_float=self.precise_float))
394407
else:
395-
self.obj = DataFrame(*loads(json, dtype=None, numpy=True, labelled=True))
408+
self.obj = DataFrame(*loads(json, dtype=None, numpy=True, labelled=True,
409+
precise_float=self.precise_float))
396410

397411
def _parse_no_numpy(self):
398412

399413
json = self.json
400414
orient = self.orient
401415

402416
if orient == "columns":
403-
self.obj = DataFrame(loads(json), dtype=None)
417+
self.obj = DataFrame(
418+
loads(json, precise_float=self.precise_float), dtype=None)
404419
elif orient == "split":
405420
decoded = dict((str(k), v)
406-
for k, v in loads(json).iteritems())
421+
for k, v in loads(
422+
json,
423+
precise_float=self.precise_float).iteritems())
407424
self.obj = DataFrame(dtype=None, **decoded)
408425
elif orient == "index":
409-
self.obj = DataFrame(loads(json), dtype=None).T
426+
self.obj = DataFrame(
427+
loads(json, precise_float=self.precise_float), dtype=None).T
410428
else:
411-
self.obj = DataFrame(loads(json), dtype=None)
429+
self.obj = DataFrame(
430+
loads(json, precise_float=self.precise_float), dtype=None)
412431

413432
def _try_convert_types(self):
414433
if self.obj is None: return

pandas/io/tests/test_json/test_pandas.py

+10
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,16 @@ def test_series_to_json_except(self):
289289
s = Series([1, 2, 3])
290290
self.assertRaises(ValueError, s.to_json, orient="garbage")
291291

292+
def test_series_from_json_precise_float(self):
293+
s = Series([4.56, 4.56, 4.56])
294+
result = read_json(s.to_json(), typ='series', precise_float=True)
295+
assert_series_equal(result, s)
296+
297+
def test_frame_from_json_precise_float(self):
298+
df = DataFrame([[4.56, 4.56, 4.56], [4.56, 4.56, 4.56]])
299+
result = read_json(df.to_json(), precise_float=True)
300+
assert_frame_equal(result, df)
301+
292302
def test_typ(self):
293303

294304
s = Series(range(6), index=['a','b','c','d','e','f'], dtype='int64')

0 commit comments

Comments
 (0)