Skip to content
This repository was archived by the owner on Feb 2, 2024. It is now read-only.

Commit 1b73f53

Browse files
authored
Scale Series.prod(skipna=True) (#577)
* Scale Series.prod(skipna=True) Add tests for nanprod Add perf test for nanprod * Fix PEP
1 parent d1ea8ff commit 1b73f53

File tree

5 files changed

+47
-2
lines changed

5 files changed

+47
-2
lines changed

sdc/datatypes/hpat_pandas_series_functions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3422,7 +3422,7 @@ def hpat_pandas_series_prod_impl(self, axis=None, skipna=None, level=None, numer
34223422
_skipna = skipna
34233423

34243424
if _skipna:
3425-
return numpy.nanprod(self._data)
3425+
return numpy_like.nanprod(self._data)
34263426
else:
34273427
return numpy.prod(self._data)
34283428

sdc/functions/numpy_like.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,3 +364,32 @@ def impl(a):
364364

365365
sdc_overload(nanmin)(nan_min_max_overload_factory(min))
366366
sdc_overload(nanmax)(nan_min_max_overload_factory(max))
367+
368+
369+
def nanprod(a):
370+
pass
371+
372+
373+
@sdc_overload(nanprod)
374+
def np_nanprod(a):
375+
"""
376+
Reimplemented with parfor from numba.targets.arraymath.
377+
"""
378+
if not isinstance(a, types.Array):
379+
return
380+
if isinstance(a.dtype, types.Integer):
381+
retty = types.intp
382+
else:
383+
retty = a.dtype
384+
one = retty(1)
385+
isnan = get_isnan(a.dtype)
386+
387+
def nanprod_impl(a):
388+
c = one
389+
for i in prange(len(a)):
390+
v = a[i]
391+
if not isnan(v):
392+
c *= v
393+
return c
394+
395+
return nanprod_impl

sdc/tests/test_sdc_numpy.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ def sdc_impl():
240240
sdc_func = self.jit(sdc_impl)
241241
np.testing.assert_array_equal(sdc_func(), ref_impl())
242242

243+
243244
class TestArrayReductions(TestCase):
244245

245246
def check_reduction_basic(self, pyfunc, alt_pyfunc, all_nans=True):
@@ -281,6 +282,15 @@ def sdc_impl(a):
281282

282283
self.check_reduction_basic(ref_impl, sdc_impl)
283284

285+
def test_nanprod(self):
286+
def ref_impl(a):
287+
return np.nanprod(a)
288+
289+
def sdc_impl(a):
290+
return numpy_like.nanprod(a)
291+
292+
self.check_reduction_basic(ref_impl, sdc_impl)
293+
284294
def test_nansum(self):
285295
def ref_impl(a):
286296
return np.nansum(a)

sdc/tests/tests_perf/test_perf_numpy.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ def _test_case(self, cases, name, total_data_length, data_num=1, input_data=test
113113
CE(type_='Python', code='np.nansum(data)', jitted=False),
114114
CE(type_='SDC', code='sdc.functions.numpy_like.nansum(data)', jitted=True),
115115
], usecase_params='data'),
116+
TC(name='nanprod', size=[10 ** 7], call_expr=[
117+
CE(type_='Python', code='np.nanprod(data)', jitted=False),
118+
CE(type_='Numba', code='np.nanprod(data)', jitted=True),
119+
CE(type_='SDC', code='sdc.functions.numpy_like.nanprod(data)', jitted=True),
120+
], usecase_params='data'),
116121
TC(name='sum', size=[10 ** 7], call_expr=[
117122
CE(type_='Python', code='np.sum(data)', jitted=False),
118123
CE(type_='Numba', code='np.sum(data)', jitted=True),

sdc/tests/tests_perf/test_perf_series.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ def _test_case(self, pyfunc, name, total_data_length, data_num=1, input_data=tes
115115
TC(name='notna', size=[10 ** 7]),
116116
TC(name='nsmallest', size=[10 ** 6]),
117117
TC(name='nunique', size=[10 ** 7]),
118-
TC(name='prod', size=[10 ** 8]),
118+
TC(name='prod', size=[10 ** 8], params='skipna=True'),
119+
TC(name='prod', size=[10 ** 8], params='skipna=False'),
119120
TC(name='pct_change', size=[10 ** 7], params='periods=1, limit=None, freq=None'),
120121
TC(name='pow', size=[10 ** 7], params='other', data_num=2),
121122
TC(name='quantile', size=[10 ** 8]),

0 commit comments

Comments
 (0)