@@ -293,8 +293,6 @@ def apply_minp(arr, ddof, minp):
293
293
gen_hpat_pandas_series_rolling_impl (arr_kurt ))
294
294
hpat_pandas_rolling_series_max_impl = register_jitable (
295
295
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 ))
298
296
hpat_pandas_rolling_series_median_impl = register_jitable (
299
297
gen_hpat_pandas_series_rolling_impl (arr_median ))
300
298
hpat_pandas_rolling_series_min_impl = register_jitable (
@@ -336,7 +334,17 @@ def result_or_nan(nfinite, minp, result):
336
334
return result
337
335
338
336
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 ):
340
348
"""Generate series rolling methods implementations based on pop/put funcs"""
341
349
def impl (self ):
342
350
win = self ._window
@@ -366,22 +374,24 @@ def impl(self):
366
374
for idx in range (interlude_start , interlude_stop ):
367
375
value = input_arr [idx ]
368
376
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 )
370
378
371
379
for idx in range (interlude_stop , chunk .stop ):
372
380
put_value = input_arr [idx ]
373
381
pop_value = input_arr [idx - win ]
374
382
nfinite , result = put (put_value , nfinite , result )
375
383
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 )
377
385
378
386
return pandas .Series (output_arr , input_series ._index ,
379
387
name = input_series ._name )
380
388
return impl
381
389
382
390
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. )
385
395
386
396
387
397
@sdc_rolling_overload (SeriesRollingType , 'apply' )
@@ -552,7 +562,30 @@ def _impl(self, other=None, pairwise=None, ddof=1):
552
562
bias_adj = count / (count - ddof )
553
563
554
564
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 )
556
589
557
590
return (mean (main_aligned * other_aligned ) - mean (main_aligned ) * mean (other_aligned )) * bias_adj
558
591
@@ -593,13 +626,13 @@ def hpat_pandas_series_rolling_max(self):
593
626
return hpat_pandas_rolling_series_max_impl
594
627
595
628
596
- @sdc_rolling_overload (SeriesRollingType , 'mean' )
629
+ @sdc_overload_method (SeriesRollingType , 'mean' )
597
630
def hpat_pandas_series_rolling_mean (self ):
598
631
599
632
ty_checker = TypeChecker ('Method rolling.mean().' )
600
633
ty_checker .check (self , SeriesRollingType )
601
634
602
- return hpat_pandas_rolling_series_mean_impl
635
+ return sdc_pandas_series_rolling_mean_impl
603
636
604
637
605
638
@sdc_rolling_overload (SeriesRollingType , 'median' )
0 commit comments