in python-package/lets_plot/_type_utils.py [0:0]
def _standardize_value(v):
if v is None:
return v
if isinstance(v, bool):
return bool(v)
if isinstance(v, str):
return str(v)
if is_float(v):
if math.isfinite(v):
return float(v)
# None for special values like 'nan' etc. because
# some JSON parsers (like com.google.gson.Gson) do not handle them well.
return None
if is_int(v):
return float(v)
if is_dict_or_dataframe(v):
return standardize_dict(v)
if is_polars_dataframe(v):
return standardize_dict(v.to_dict(as_series=False))
if isinstance(v, list):
return [_standardize_value(elem) for elem in v]
if isinstance(v, tuple):
return tuple(_standardize_value(elem) for elem in v)
if (numpy and isinstance(v, numpy.ndarray)):
# Process each array element individually.
# Don't use '.tolist()' because this will implicitly
# convert 'datetime64' values to unpredictable 'datetime' objects.
return [_standardize_value(x) for x in v]
if (pandas and isinstance(v, pandas.Series)) or (jnp and isinstance(v, jnp.ndarray)):
return _standardize_value(v.tolist())
# Universal NaT/NaN check
if pandas and pandas.isna(v):
return None
if isinstance(v, datetime):
# Datetime: to milliseconds since epoch (time zone aware)
return v.timestamp() * 1000
if isinstance(v, date):
# Local date: to milliseconds since epoch (midnight UTC)
return datetime.combine(v, time.min, tzinfo=timezone.utc).timestamp() * 1000
if isinstance(v, time):
# Local time: to milliseconds since midnight
return float(v.hour * 3600_000 + v.minute * 60_000 + v.second * 1000 + v.microsecond // 1000)
if numpy and isinstance(v, numpy.datetime64):
try:
# numpy.datetime64: to milliseconds since epoch (Unix time)
return float(v.astype('datetime64[ms]').astype(numpy.int64))
except:
return None
if shapely and isinstance(v, shapely.geometry.base.BaseGeometry):
return json.dumps(shapely.geometry.mapping(v))
try:
return repr(v)
except Exception:
raise Exception('Unsupported type: {0}({1})'.format(v, type(v)))