def unbox_dataframe(typ, val, c): """unbox dataframe to an empty DataFrame struct columns will be extracted later if necessary. """ n_cols = len(typ.columns) column_strs = [ numba.unicode.make_string_from_constant(c.context, c.builder, string_type, a) for a in typ.columns ] # create dataframe struct and store values dataframe = cgutils.create_struct_proxy(typ)(c.context, c.builder) column_tup = c.context.make_tuple(c.builder, types.UniTuple(string_type, n_cols), column_strs) # this unboxes all DF columns so that no column unboxing occurs later for col_ind in range(n_cols): series_obj = c.pyapi.object_getattr_string(val, typ.columns[col_ind]) arr_obj = c.pyapi.object_getattr_string(series_obj, "values") ty_series = typ.data[col_ind] if isinstance(ty_series, types.Array): native_val = unbox_array(typ.data[col_ind], arr_obj, c) elif ty_series == string_array_type: native_val = unbox_str_series(string_array_type, series_obj, c) dataframe.data = c.builder.insert_value(dataframe.data, native_val.value, col_ind) # TODO: support unboxing index if typ.index == types.none: dataframe.index = c.context.get_constant(types.none, None) if typ.index == string_array_type: index_obj = c.pyapi.object_getattr_string(val, "index") dataframe.index = unbox_str_series(string_array_type, index_obj, c).value if isinstance(typ.index, types.Array): index_obj = c.pyapi.object_getattr_string(val, "index") index_data = c.pyapi.object_getattr_string(index_obj, "_data") dataframe.index = unbox_array(typ.index, index_data, c).value dataframe.columns = column_tup dataframe.parent = val # increase refcount of stored values if c.context.enable_nrt: # TODO: other objects? for var in column_strs: c.context.nrt.incref(c.builder, string_type, var) return NativeValue(dataframe._getvalue())
def unbox_categorical_array(typ, val, c): arr_obj = c.pyapi.object_getattr_string(val, "codes") # c.pyapi.print_object(arr_obj) dtype = get_categories_int_type(typ.dtype) native_val = unbox_array(types.Array(dtype, 1, 'C'), arr_obj, c) c.pyapi.decref(arr_obj) return native_val
def lower_unbox_df_column(context, builder, sig, args): # FIXME: last arg should be types.DType? pyapi = context.get_python_api(builder) c = numba.pythonapi._UnboxContext(context, builder, pyapi) # TODO: refcounts? col_ind = sig.args[1].value col_name = sig.args[0].col_names[col_ind] series_obj = c.pyapi.object_getattr_string(args[0], col_name) arr_obj = c.pyapi.object_getattr_string(series_obj, "values") if isinstance(sig.args[2], types.Const) and sig.args[2].value == 11: # FIXME: str code native_val = unbox_str_series(string_array_type, arr_obj, c) else: if isinstance( sig.args[2], types.Const) and sig.args[2].value == 12: # FIXME: dt64 code dtype = types.NPDatetime('ns') else: dtype = sig.args[2].dtype # TODO: error handling like Numba callwrappers.py native_val = unbox_array(types.Array(dtype=dtype, ndim=1, layout='C'), arr_obj, c) c.pyapi.decref(series_obj) c.pyapi.decref(arr_obj) return native_val.value
def _unbox_series_data(dtype, data_typ, arr_obj, c): if data_typ == string_array_type: return unbox_str_series(string_array_type, arr_obj, c) elif data_typ == list_string_array_type: return _unbox_array_list_str(arr_obj, c) elif isinstance(dtype, PDCategoricalDtype): return unbox_categorical_array(data_typ, arr_obj, c) # TODO: error handling like Numba callwrappers.py return unbox_array(data_typ, arr_obj, c)
def unbox_series(typ, val, c): arr_obj = c.pyapi.object_getattr_string(val, "values") if typ.dtype == string_type: native_val = unbox_str_series(string_array_type, arr_obj, c) elif typ.dtype == datetime_date_type: native_val = unbox_datetime_date_array(typ, val, c) else: # TODO: error handling like Numba callwrappers.py native_val = unbox_array(types.Array(dtype=typ.dtype, ndim=1, layout='C'), arr_obj, c) c.pyapi.decref(arr_obj) return native_val
def _unbox_series_data(dtype, data_typ, arr_obj, c): if data_typ == string_array_type: return unbox_str_series(string_array_type, arr_obj, c) elif dtype == datetime_date_type: return unbox_datetime_date_array(data_typ, arr_obj, c) elif data_typ == list_string_array_type: return _unbox_array_list_str(arr_obj, c) elif data_typ == string_array_split_view_type: # XXX dummy unboxing to avoid errors in _get_dataframe_data() out_view = c.context.make_helper(c.builder, string_array_split_view_type) return NativeValue(out_view._getvalue()) elif isinstance(dtype, PDCategoricalDtype): return unbox_categorical_array(data_typ, arr_obj, c) # TODO: error handling like Numba callwrappers.py return unbox_array(data_typ, arr_obj, c)
def unbox_dataframe(typ, val, c): """unbox dataframe to an empty DataFrame struct columns will be extracted later if necessary. """ n_cols = len(typ.columns) column_strs = [ numba.unicode.make_string_from_constant(c.context, c.builder, string_type, a) for a in typ.columns ] # create dataframe struct and store values dataframe = cgutils.create_struct_proxy(typ)(c.context, c.builder) column_tup = c.context.make_tuple(c.builder, types.UniTuple(string_type, n_cols), column_strs) zero = c.context.get_constant(types.int8, 0) unboxed_tup = c.context.make_tuple(c.builder, types.UniTuple(types.int8, n_cols + 1), [zero] * (n_cols + 1)) # TODO: support unboxing index if typ.index == types.none: dataframe.index = c.context.get_constant(types.none, None) if typ.index == string_array_type: index_obj = c.pyapi.object_getattr_string(val, "index") dataframe.index = unbox_str_series(string_array_type, index_obj, c).value if isinstance(typ.index, types.Array): index_obj = c.pyapi.object_getattr_string(val, "index") index_data = c.pyapi.object_getattr_string(index_obj, "_data") dataframe.index = unbox_array(typ.index, index_data, c).value dataframe.columns = column_tup dataframe.unboxed = unboxed_tup dataframe.parent = val # increase refcount of stored values if c.context.enable_nrt: # TODO: other objects? for var in column_strs: c.context.nrt.incref(c.builder, string_type, var) return NativeValue(dataframe._getvalue())
def unbox_series(typ, val, c): arr_obj = c.pyapi.object_getattr_string(val, "values") series = cgutils.create_struct_proxy(typ)(c.context, c.builder) series.data = _unbox_series_data(typ.dtype, typ.data, arr_obj, c).value # TODO: other indices if typ.index == string_array_type: index_obj = c.pyapi.object_getattr_string(val, "index") series.index = unbox_str_series(string_array_type, index_obj, c).value if isinstance(typ.index, types.Array): index_obj = c.pyapi.object_getattr_string(val, "index") index_data = c.pyapi.object_getattr_string(index_obj, "_data") series.index = unbox_array(typ.index, index_data, c).value if typ.is_named: name_obj = c.pyapi.object_getattr_string(val, "name") series.name = numba.unicode.unbox_unicode_str(string_type, name_obj, c).value # TODO: handle index and name c.pyapi.decref(arr_obj) return NativeValue(series._getvalue())