# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """ Superset utilities for pandas.DataFrame. """ import warnings from typing import Any, Dict, List import pandas as pd from superset.utils.core import JS_MAX_INTEGER def _convert_big_integers(val: Any) -> Any: """ Cast integers larger than ``JS_MAX_INTEGER`` to strings. :param val: the value to process :returns: the same value but recast as a string if it was an integer over ``JS_MAX_INTEGER`` """ return str(val) if isinstance(val, int) and abs(val) > JS_MAX_INTEGER else val def df_to_records(dframe: pd.DataFrame) -> List[Dict[str, Any]]: """ Convert a DataFrame to a set of records. :param dframe: the DataFrame to convert :returns: a list of dictionaries reflecting each single row of the DataFrame """ if not dframe.columns.is_unique: warnings.warn( "DataFrame columns are not unique, some columns will be omitted.", UserWarning, stacklevel=2, ) columns = dframe.columns return list( dict(zip(columns, map(_convert_big_integers, row))) for row in zip(*[dframe[col] for col in columns]) )