Skip to content

Commit c3f74d5

Browse files
refactor polynomial model class and deseasonality functions, refine comments
1 parent 7e48255 commit c3f74d5

18 files changed

+278
-305
lines changed

src/Microsoft.ML.TimeSeries/Deseasonality/DeseasonalityBase.cs

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/Microsoft.ML.TimeSeries/Deseasonality/MeanDeseasonality.cs

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/Microsoft.ML.TimeSeries/Deseasonality/MedianDeseasonality.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/Microsoft.ML.TimeSeries/Deseasonality/StlDeseasonality.cs

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/Microsoft.ML.TimeSeries/Microsoft.ML.TimeSeries.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,4 @@
1010
<ProjectReference Include="..\Microsoft.ML.Data\Microsoft.ML.Data.csproj" />
1111
<ProjectReference Include="..\Microsoft.ML.Transforms\Microsoft.ML.Transforms.csproj" />
1212
</ItemGroup>
13-
14-
<ItemGroup>
15-
<Folder Include="Deseasonality\" />
16-
</ItemGroup>
1713
</Project>

src/Microsoft.ML.TimeSeries/PolynomialModel/AbstractPolynomialModel.cs

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/Microsoft.ML.TimeSeries/PolynomialModel/LinearModel.cs

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/Microsoft.ML.TimeSeries/PolynomialModel/PolynomialModel.cs

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Microsoft.ML.TimeSeries
5+
{
6+
internal interface IDeseasonality
7+
{
8+
public abstract void Deseasonality(ref double[] values, int period, ref double[] results);
9+
}
10+
11+
internal sealed class MeanDeseasonality : IDeseasonality
12+
{
13+
private double[] _circularComponent;
14+
15+
public void Deseasonality(ref double[] values, int period, ref double[] results)
16+
{
17+
Array.Resize(ref _circularComponent, period);
18+
19+
var length = values.Length;
20+
21+
// Initialize the circular component to 0.
22+
for (int i = 0; i < period; ++i)
23+
{
24+
_circularComponent[i] = 0;
25+
}
26+
27+
// Sum up values that locates at the same position in one period.
28+
for (int i = 0; i < length; ++i)
29+
{
30+
var indexInPeriod = i % period;
31+
_circularComponent[indexInPeriod] += values[i];
32+
}
33+
34+
// Calculate the mean value as circular component.
35+
var cnt = (length - 1) / period;
36+
var rest = (length - 1) % period;
37+
for (int i = 0; i < period; ++i)
38+
{
39+
var lastCircle = i <= rest ? 1 : 0;
40+
_circularComponent[i] = _circularComponent[i] / (cnt + lastCircle);
41+
}
42+
43+
// Substract the circular component from the original series.
44+
for (int i = 0; i < length; ++i)
45+
{
46+
var indexInPeriod = i % period;
47+
results[i] -= _circularComponent[indexInPeriod];
48+
}
49+
}
50+
}
51+
52+
internal sealed class MedianDeseasonality : IDeseasonality
53+
{
54+
private List<double>[] _subSeries;
55+
private double[] _circularComponent;
56+
57+
public void Deseasonality(ref double[] values, int period, ref double[] results)
58+
{
59+
Array.Resize(ref _circularComponent, period);
60+
Array.Resize(ref _subSeries, period);
61+
62+
var length = values.Length;
63+
64+
for (int i = 0; i < period; ++i)
65+
{
66+
_subSeries[i] = new List<double>();
67+
}
68+
69+
// Split the original series into #period subseries.
70+
for (int i = 0; i < length; ++i)
71+
{
72+
var indexInPeriod = i % period;
73+
_subSeries[indexInPeriod].Add(values[i]);
74+
}
75+
76+
// Calculate the median value as circular component.
77+
for (int i = 0; i < period; ++i)
78+
{
79+
_circularComponent[i] = MathUtility.QuickMedian(_subSeries[i]);
80+
}
81+
82+
// Substract the circular component from the original series.
83+
for (int i = 0; i < length; ++i)
84+
{
85+
var indexInPeriod = i % period;
86+
results[i] -= _circularComponent[indexInPeriod];
87+
}
88+
}
89+
}
90+
91+
internal sealed class StlDeseasonality : IDeseasonality
92+
{
93+
private readonly InnerStl _stl;
94+
95+
public StlDeseasonality()
96+
{
97+
_stl = new InnerStl(true);
98+
}
99+
100+
public void Deseasonality(ref double[] values, int period, ref double[] results)
101+
{
102+
bool success = _stl.Decomposition(values, period);
103+
if (success)
104+
{
105+
for (int i = 0; i < _stl.Residual.Count; ++i)
106+
{
107+
results[i] = _stl.Residual[i];
108+
}
109+
}
110+
else
111+
{
112+
for (int i = 0; i < values.Length; ++i)
113+
{
114+
results[i] = values[i];
115+
}
116+
}
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)