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