@@ -293,8 +293,6 @@ def apply_minp(arr, ddof, minp):
293293 gen_hpat_pandas_series_rolling_impl (arr_kurt ))
294294hpat_pandas_rolling_series_max_impl = register_jitable (
295295 gen_hpat_pandas_series_rolling_impl (arr_max ))
296- hpat_pandas_rolling_series_mean_impl = register_jitable (
297- gen_hpat_pandas_series_rolling_impl (arr_mean ))
298296hpat_pandas_rolling_series_median_impl = register_jitable (
299297 gen_hpat_pandas_series_rolling_impl (arr_median ))
300298hpat_pandas_rolling_series_min_impl = register_jitable (
@@ -336,7 +334,17 @@ def result_or_nan(nfinite, minp, result):
336334 return result
337335
338336
339- def gen_sdc_pandas_series_rolling_impl (pop , put , init_result = numpy .nan ):
337+ @sdc_register_jitable
338+ def mean_result_or_nan (nfinite , minp , result ):
339+ """Get result mean taking into account min periods."""
340+ if nfinite == 0 or nfinite < minp :
341+ return numpy .nan
342+
343+ return result / nfinite
344+
345+
346+ def gen_sdc_pandas_series_rolling_impl (pop , put , get_result = result_or_nan ,
347+ init_result = numpy .nan ):
340348 """Generate series rolling methods implementations based on pop/put funcs"""
341349 def impl (self ):
342350 win = self ._window
@@ -366,22 +374,24 @@ def impl(self):
366374 for idx in range (interlude_start , interlude_stop ):
367375 value = input_arr [idx ]
368376 nfinite , result = put (value , nfinite , result )
369- output_arr [idx ] = result_or_nan (nfinite , minp , result )
377+ output_arr [idx ] = get_result (nfinite , minp , result )
370378
371379 for idx in range (interlude_stop , chunk .stop ):
372380 put_value = input_arr [idx ]
373381 pop_value = input_arr [idx - win ]
374382 nfinite , result = put (put_value , nfinite , result )
375383 nfinite , result = pop (pop_value , nfinite , result )
376- output_arr [idx ] = result_or_nan (nfinite , minp , result )
384+ output_arr [idx ] = get_result (nfinite , minp , result )
377385
378386 return pandas .Series (output_arr , input_series ._index ,
379387 name = input_series ._name )
380388 return impl
381389
382390
383- sdc_pandas_series_rolling_sum_impl = register_jitable (
384- gen_sdc_pandas_series_rolling_impl (pop_sum , put_sum , init_result = 0. ))
391+ sdc_pandas_series_rolling_mean_impl = gen_sdc_pandas_series_rolling_impl (
392+ pop_sum , put_sum , get_result = mean_result_or_nan , init_result = 0. )
393+ sdc_pandas_series_rolling_sum_impl = gen_sdc_pandas_series_rolling_impl (
394+ pop_sum , put_sum , init_result = 0. )
385395
386396
387397@sdc_rolling_overload (SeriesRollingType , 'apply' )
@@ -552,7 +562,30 @@ def _impl(self, other=None, pairwise=None, ddof=1):
552562 bias_adj = count / (count - ddof )
553563
554564 def mean (series ):
555- return series .rolling (win , min_periods = minp ).mean ()
565+ # cannot call return series.rolling(win, min_periods=minp).mean()
566+ # due to different float rounding in new and old implementations
567+ # TODO: fix this during optimizing of covariance
568+ input_arr = series ._data
569+ length = len (input_arr )
570+ output_arr = numpy .empty (length , dtype = float64 )
571+
572+ def apply_minp (arr , minp ):
573+ finite_arr = arr [numpy .isfinite (arr )]
574+ if len (finite_arr ) < minp :
575+ return numpy .nan
576+ else :
577+ return arr_mean (finite_arr )
578+
579+ boundary = min (win , length )
580+ for i in prange (boundary ):
581+ arr_range = input_arr [:i + 1 ]
582+ output_arr [i ] = apply_minp (arr_range , minp )
583+
584+ for i in prange (boundary , length ):
585+ arr_range = input_arr [i + 1 - win :i + 1 ]
586+ output_arr [i ] = apply_minp (arr_range , minp )
587+
588+ return pandas .Series (output_arr , series ._index , name = series ._name )
556589
557590 return (mean (main_aligned * other_aligned ) - mean (main_aligned ) * mean (other_aligned )) * bias_adj
558591
@@ -593,13 +626,13 @@ def hpat_pandas_series_rolling_max(self):
593626 return hpat_pandas_rolling_series_max_impl
594627
595628
596- @sdc_rolling_overload (SeriesRollingType , 'mean' )
629+ @sdc_overload_method (SeriesRollingType , 'mean' )
597630def hpat_pandas_series_rolling_mean (self ):
598631
599632 ty_checker = TypeChecker ('Method rolling.mean().' )
600633 ty_checker .check (self , SeriesRollingType )
601634
602- return hpat_pandas_rolling_series_mean_impl
635+ return sdc_pandas_series_rolling_mean_impl
603636
604637
605638@sdc_rolling_overload (SeriesRollingType , 'median' )
0 commit comments