Skip to content
This repository was archived by the owner on Feb 2, 2024. It is now read-only.
Prev Previous commit
Next Next commit
Merge branch 'master' into dfat
  • Loading branch information
1e-to authored Apr 16, 2020
commit 928dae88ea4f7f3c7dd53ec0dd777d88786c6d2f
147 changes: 147 additions & 0 deletions sdc/datatypes/hpat_pandas_dataframe_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1919,6 +1919,140 @@ def _df_getitem_tuple_at_impl(self, idx):
return func_text, global_vars


def df_getitem_int_iloc_codegen(self, idx):
"""
Example of generated implementation:
def _df_getitem_int_iloc_impl(self, idx):
if -1 < idx < len(self._dataframe.index):
data_0 = pandas.Series(self._dataframe._data[0])
result_0 = data_0.iat[idx]
data_1 = pandas.Series(self._dataframe._data[1])
result_1 = data_1.iat[idx]
return pandas.Series(data=[result_0, result_1], index=['A', 'B'], name=str(idx))
raise IndexingError('Index is out of bounds for axis')
"""
func_lines = ['def _df_getitem_int_iloc_impl(self, idx):',
' if -1 < idx < len(self._dataframe.index):']
results = []
index = []
name = 'self._dataframe._index[idx]'
if isinstance(self.index, types.NoneType):
name = 'idx'
for i, c in enumerate(self.columns):
result_c = f"result_{i}"
func_lines += [f" data_{i} = pandas.Series(self._dataframe._data[{i}])",
f" {result_c} = data_{i}.iat[idx]"]
results.append(result_c)
index.append(c)
data = ', '.join(col for col in results)
func_lines += [f" return pandas.Series(data=[{data}], index={index}, name=str({name}))",
f" raise IndexingError('Index is out of bounds for axis')"]

func_text = '\n'.join(func_lines)
global_vars = {'pandas': pandas, 'numpy': numpy, 'IndexingError': IndexingError}

return func_text, global_vars


def df_getitem_slice_iloc_codegen(self, idx):
"""
Example of generated implementation:
def _df_getitem_slice_iloc_impl(self, idx):
data_0 = pandas.Series(self._dataframe._data[0])
result_0 = data_0.iloc[idx]
data_1 = pandas.Series(self._dataframe._data[1])
result_1 = data_1.iloc[idx]
return pandas.DataFrame(data={"A": result_0, "B": result_1}, index=self._dataframe.index[idx])
"""
func_lines = ['def _df_getitem_slice_iloc_impl(self, idx):']
results = []
for i, c in enumerate(self.columns):
result_c = f"result_{i}"
func_lines += [f" data_{i} = pandas.Series(self._dataframe._data[{i}])",
f" {result_c} = data_{i}.iloc[idx]"]
results.append((c, result_c))
data = ', '.join(f'"{col}": {data}' for col, data in results)
func_lines += [f" return pandas.DataFrame(data={{{data}}}, index=self._dataframe.index[idx])"]

func_text = '\n'.join(func_lines)
global_vars = {'pandas': pandas, 'numpy': numpy}

return func_text, global_vars


def df_getitem_list_iloc_codegen(self, idx):
"""
Example of generated implementation:
def _df_getitem_list_iloc_impl(self, idx):
check_idx = False
for i in idx:
if -1 < i < len(self._dataframe.index):
check_idx = True
if check_idx == True:
data_0 = pandas.Series(self._dataframe._data[0])
result_0 = data_0.iloc[numpy.array(idx)]
data_1 = pandas.Series(self._dataframe._data[1])
result_1 = data_1.iloc[numpy.array(idx)]
return pandas.DataFrame(data={"A": result_0, "B": result_1}, index=idx)
raise IndexingError('Index is out of bounds for axis')
"""
func_lines = ['def _df_getitem_list_iloc_impl(self, idx):',
' check_idx = False',
' for i in idx:',
' if -1 < i < len(self._dataframe.index):',
' check_idx = True',
' if check_idx == True:']
results = []
index = '[self._dataframe._index[i] for i in idx]'
if isinstance(self.index, types.NoneType):
index = 'idx'
for i, c in enumerate(self.columns):
result_c = f"result_{i}"
func_lines += [f" data_{i} = pandas.Series(self._dataframe._data[{i}])",
f" {result_c} = data_{i}.iloc[numpy.array(idx)]"]
results.append((c, result_c))
data = ', '.join(f'"{col}": {data}' for col, data in results)
func_lines += [f" return pandas.DataFrame(data={{{data}}}, index={index})",
f" raise IndexingError('Index is out of bounds for axis')"]

func_text = '\n'.join(func_lines)
global_vars = {'pandas': pandas, 'numpy': numpy, 'IndexingError': IndexingError}

return func_text, global_vars


def df_getitem_list_bool_iloc_codegen(self, idx):
"""
Example of generated implementation:
def _df_getitem_list_bool_iloc_impl(self, idx):
if len(self._dataframe.index) == len(idx):
data_0 = self._dataframe._data[0]
result_0 = pandas.Series(data_0[numpy.array(idx)])
data_1 = self._dataframe._data[1]
result_1 = pandas.Series(data_1[numpy.array(idx)])
return pandas.DataFrame(data={"A": result_0, "B": result_1},
index=self._dataframe.index[numpy.array(idx)])
raise IndexingError('Item wrong length')
"""
func_lines = ['def _df_getitem_list_bool_iloc_impl(self, idx):']
results = []
index = 'self._dataframe.index[numpy.array(idx)]'
func_lines += [' if len(self._dataframe.index) == len(idx):']
for i, c in enumerate(self.columns):
result_c = f"result_{i}"
func_lines += [f" data_{i} = self._dataframe._data[{i}]",
f" {result_c} = pandas.Series(data_{i}[numpy.array(idx)])"]
results.append((c, result_c))
data = ', '.join(f'"{col}": {data}' for col, data in results)
func_lines += [f" return pandas.DataFrame(data={{{data}}}, index={index})",
f" raise IndexingError('Item wrong length')"]

func_text = '\n'.join(func_lines)
global_vars = {'pandas': pandas, 'numpy': numpy, 'IndexingError': IndexingError}

return func_text, global_vars


def gen_df_getitem_tuple_at_impl(self, row, col):
func_text, global_vars = df_getitem_tuple_at_codegen(self, row, col)
loc_vars = {}
Expand All @@ -1928,6 +2062,19 @@ def gen_df_getitem_tuple_at_impl(self, row, col):
return _reduce_impl


gen_df_getitem_iloc_int_impl = gen_impl_generator(
df_getitem_int_iloc_codegen, '_df_getitem_int_iloc_impl')

gen_df_getitem_iloc_slice_impl = gen_impl_generator(
df_getitem_slice_iloc_codegen, '_df_getitem_slice_iloc_impl')

gen_df_getitem_iloc_list_impl = gen_impl_generator(
df_getitem_list_iloc_codegen, '_df_getitem_list_iloc_impl')

gen_df_getitem_iloc_list_bool_impl = gen_impl_generator(
df_getitem_list_bool_iloc_codegen, '_df_getitem_list_bool_iloc_impl')


@sdc_overload(operator.getitem)
def sdc_pandas_dataframe_accessor_getitem(self, idx):
if not isinstance(self, DataFrameGetitemAccessorType):
Expand Down
You are viewing a condensed version of this merge commit. You can view the full changes here.