Source code for idmtools_calibra.utilities.encoding
import base64
import datetime
import json
from uuid import UUID
import pandas as pd
import numpy as np
[docs]class NumpyEncoder(json.JSONEncoder):
[docs] def default(self, obj):
"""If input object is an ndarray it will be converted into a dict
holding dtype, shape and the data, base64 encoded.
"""
if isinstance(obj, np.int64):
return int(obj) # because JSON doesn't know what to do with np.int64 (on Windows)
elif isinstance(obj, np.int32):
return int(obj) # because JSON doesn't know what to do with np.int32 (on Windows)
elif isinstance(obj, np.ndarray):
if obj.flags['C_CONTIGUOUS']:
obj_data = obj.data
else:
cont_obj = np.ascontiguousarray(obj)
assert (cont_obj.flags['C_CONTIGUOUS'])
obj_data = cont_obj.data
data_b64 = base64.b64encode(obj_data).decode('utf-8')
return dict(__ndarray__=data_b64,
dtype=str(obj.dtype),
shape=obj.shape)
elif isinstance(obj, pd.DataFrame):
return json.loads(obj.to_json())
try:
# Let the base class default method raise the TypeError
return super(NumpyEncoder, self).default(obj)
except TypeError:
return str(obj)
[docs]class GeneralEncoder(NumpyEncoder):
[docs] def default(self, obj):
from COMPS.Data.Simulation import SimulationState
from idmtools.entities.simulation import Simulation
if isinstance(obj, SimulationState):
return obj.name
elif isinstance(obj, set):
return list(obj)
elif isinstance(obj, datetime.datetime):
return str(obj)
elif isinstance(obj, Simulation):
return obj.toJSON()
elif isinstance(obj, UUID):
return str(obj)
elif isinstance(obj, pd.Series):
return obj.to_json(orient='split')
return super(GeneralEncoder, self).default(obj)
[docs]def json_numpy_obj_hook(dct):
"""Decodes a previously encoded numpy ndarray with proper shape and dtype.
:param dct: (dict) json encoded ndarray
:return: (ndarray) if input was an encoded ndarray
"""
if isinstance(dct, dict) and '__ndarray__' in dct:
data = base64.b64decode(dct['__ndarray__'])
return np.frombuffer(data, dct['dtype']).reshape(dct['shape'])
return dct
[docs]def cast_number(val):
"""
Try casting the value to float/int returns str if cannot
:param val: the value to cast
:return: value casted
"""
if "." in str(val):
try:
return float(val)
except (ValueError, TypeError):
return val
try:
return int(val)
except (ValueError, TypeError):
return val