def _standardize_value()

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)))