in azure/Kqlmagic/kql_proxy.py [0:0]
def to_dataframe(self, raise_errors=True, options=None):
"""Returns Pandas data frame."""
options = options or {}
pandas = Dependencies.get_module("pandas")
if self.data_table.columns_count == 0 or self.data_table.rows_count == 0:
# return pandas.DataFrame()
pass
frame = pandas.DataFrame(self.data_table.rows, columns=self.data_table.columns_name)
for (idx, col_name) in enumerate(self.data_table.columns_name):
col_type = self.data_table.columns_type[idx].lower()
if col_type == "timespan":
frame[col_name] = pandas.to_timedelta(
frame[col_name].apply(lambda t: t.replace(".", " days ") if type(t) is str and "." in t.split(":")[0] else t)
)
elif col_type == "datetime":
frame[col_name] = pandas.to_datetime(
frame[col_name].apply(lambda d: d if self._is_valid_datetime(d) else None)
)
elif col_type == "string":
# frame[col_name] = frame[col_name].apply(lambda x: json_dumps(x) if type(x) == str else x)
pass
elif col_type == "dynamic":
if options.get("dynamic_to_dataframe") == "str":
frame[col_name] = frame[col_name].apply(lambda x: self._dynamic_to_str(x))
else:
frame[col_name] = frame[col_name].apply(lambda x: self._dynamic_to_object(x))
elif col_type in self.KQL_TO_DATAFRAME_DATA_TYPES:
pandas_type = self.KQL_TO_DATAFRAME_DATA_TYPES[col_type]
# NA type promotion
if pandas_type == "int64" or pandas_type == "int32":
for i in range(0, len(frame[col_name])):
if frame[col_name][i] is None or str(frame[col_name][i]) == "nan":
pandas_type = "float64"
break
elif pandas_type == "bool":
for i in range(0, len(frame[col_name])):
if frame[col_name][i] is None or str(frame[col_name][i]) == "nan":
pandas_type = "object"
break
frame[col_name] = frame[col_name].astype(pandas_type, errors="raise" if raise_errors else "ignore")
return frame