@@ -1596,30 +1596,34 @@ void CTimeSeriesDecompositionDetail::CComponents::reweightOutliers(
1596
1596
})};
1597
1597
double numberOutliers{SEASONAL_OUTLIER_FRACTION * numberValues};
1598
1598
1599
- TMinAccumulator outliers{static_cast <std::size_t >(2.0 * numberOutliers)};
1600
- TMeanAccumulator meanDifference;
1601
- core_t ::TTime time = startTime + dt / 2 ;
1602
- for (std::size_t i = 0 ; i < values.size (); ++i, time += dt) {
1603
- if (CBasicStatistics::count (values[i]) > 0.0 ) {
1604
- double difference{std::fabs (CBasicStatistics::mean (values[i]) - predictor (time ))};
1605
- outliers.add ({-difference, i});
1606
- meanDifference.add (difference);
1607
- }
1608
- }
1609
- outliers.sort ();
1610
- TMeanAccumulator meanDifferenceOfOutliers;
1611
- for (std::size_t i = 0u ; i < static_cast <std::size_t >(numberOutliers); ++i) {
1612
- meanDifferenceOfOutliers.add (-outliers[i].first );
1613
- }
1614
- meanDifference -= meanDifferenceOfOutliers;
1615
- for (std::size_t i = 0 ; i < outliers.count (); ++i) {
1616
- if (-outliers[i].first > SEASONAL_OUTLIER_DIFFERENCE_THRESHOLD *
1617
- CBasicStatistics::mean (meanDifference)) {
1618
- double weight{SEASONAL_OUTLIER_WEIGHT +
1619
- (1.0 - SEASONAL_OUTLIER_WEIGHT) *
1620
- CTools::logisticFunction (static_cast <double >(i) / numberOutliers,
1621
- 0.1 , 1.0 )};
1622
- CBasicStatistics::count (values[outliers[i].second ]) *= weight;
1599
+ if (numberOutliers > 1.0 ) {
1600
+
1601
+ TMinAccumulator outliers{static_cast <std::size_t >(2.0 * numberOutliers)};
1602
+ TMeanAccumulator meanDifference;
1603
+ core_t ::TTime time = startTime + dt / 2 ;
1604
+ for (std::size_t i = 0 ; i < values.size (); ++i, time += dt) {
1605
+ if (CBasicStatistics::count (values[i]) > 0.0 ) {
1606
+ double difference{
1607
+ std::fabs (CBasicStatistics::mean (values[i]) - predictor (time ))};
1608
+ outliers.add ({-difference, i});
1609
+ meanDifference.add (difference);
1610
+ }
1611
+ }
1612
+ outliers.sort ();
1613
+ TMeanAccumulator meanDifferenceOfOutliers;
1614
+ for (std::size_t i = 0u ; i < static_cast <std::size_t >(numberOutliers); ++i) {
1615
+ meanDifferenceOfOutliers.add (-outliers[i].first );
1616
+ }
1617
+ meanDifference -= meanDifferenceOfOutliers;
1618
+ for (std::size_t i = 0 ; i < outliers.count (); ++i) {
1619
+ if (-outliers[i].first > SEASONAL_OUTLIER_DIFFERENCE_THRESHOLD *
1620
+ CBasicStatistics::mean (meanDifference)) {
1621
+ double weight{SEASONAL_OUTLIER_WEIGHT +
1622
+ (1.0 - SEASONAL_OUTLIER_WEIGHT) *
1623
+ CTools::logisticFunction (static_cast <double >(i) / numberOutliers,
1624
+ 0.1 , 1.0 )};
1625
+ CBasicStatistics::count (values[outliers[i].second ]) *= weight;
1626
+ }
1623
1627
}
1624
1628
}
1625
1629
}
0 commit comments