Averages/Simple moving average: Difference between revisions

Content added Content deleted
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 678: Line 678:
return 0;
return 0;
}</lang>
}</lang>

=={{header|C sharp|C#}}==

{{works with|C sharp|C#|3}}

<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;

namespace SMA {
class Program {
static void Main(string[] args) {
var nums = Enumerable.Range(1, 5).Select(n => (double)n);
nums = nums.Concat(nums.Reverse());

var sma3 = SMA(3);
var sma5 = SMA(5);

foreach (var n in nums) {
Console.WriteLine("{0} (sma3) {1,-16} (sma5) {2,-16}", n, sma3(n), sma5(n));
}
}

static Func<double, double> SMA(int p) {
Queue<double> s = new Queue<double>(p);
return (x) => {
if (s.Count >= p) {
s.Dequeue();
}
s.Enqueue(x);
return s.Average();
};
}
}
}</lang>

{{out}}
<pre>
1 (sma3) 1 (sma5) 1
2 (sma3) 1.5 (sma5) 1.5
3 (sma3) 2 (sma5) 2
4 (sma3) 3 (sma5) 2.5
5 (sma3) 4 (sma5) 3
5 (sma3) 4.66666666666667 (sma5) 3.8
4 (sma3) 4.66666666666667 (sma5) 4.2
3 (sma3) 4 (sma5) 4.2
2 (sma3) 3 (sma5) 3.8
1 (sma3) 2 (sma5) 3
</pre>


=={{header|C++}}==
=={{header|C++}}==
Line 783: Line 832:
}
}
</lang>
</lang>

=={{header|C sharp|C#}}==

{{works with|C sharp|C#|3}}

<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;

namespace SMA {
class Program {
static void Main(string[] args) {
var nums = Enumerable.Range(1, 5).Select(n => (double)n);
nums = nums.Concat(nums.Reverse());

var sma3 = SMA(3);
var sma5 = SMA(5);

foreach (var n in nums) {
Console.WriteLine("{0} (sma3) {1,-16} (sma5) {2,-16}", n, sma3(n), sma5(n));
}
}

static Func<double, double> SMA(int p) {
Queue<double> s = new Queue<double>(p);
return (x) => {
if (s.Count >= p) {
s.Dequeue();
}
s.Enqueue(x);
return s.Average();
};
}
}
}</lang>

{{out}}
<pre>
1 (sma3) 1 (sma5) 1
2 (sma3) 1.5 (sma5) 1.5
3 (sma3) 2 (sma5) 2
4 (sma3) 3 (sma5) 2.5
5 (sma3) 4 (sma5) 3
5 (sma3) 4.66666666666667 (sma5) 3.8
4 (sma3) 4.66666666666667 (sma5) 4.2
3 (sma3) 4 (sma5) 4.2
2 (sma3) 3 (sma5) 3.8
1 (sma3) 2 (sma5) 3
</pre>


=={{header|Clojure}}==
=={{header|Clojure}}==
Line 1,715: Line 1,715:
f(2); # 3
f(2); # 3
f(1); # 2</lang>
f(1); # 2</lang>

=={{header|Go}}==
=={{header|Go}}==
<lang go>package main
<lang go>package main
Line 2,358: Line 2,359:
end function
end function
</lang>
</lang>

=={{header|Logo}}==
=={{header|Logo}}==
Although Logo does not support closures, some varieties of Logo support enough metaprogramming to accomplish this task.
Although Logo does not support closures, some varieties of Logo support enough metaprogramming to accomplish this task.
Line 2,510: Line 2,510:
num: 41 sma3: 62.333333 sma5: 47
num: 41 sma3: 62.333333 sma5: 47
num: 94 sma3: 61 sma5: 64.2</pre>
num: 94 sma3: 61 sma5: 64.2</pre>



=={{header|NetRexx}}==
=={{header|NetRexx}}==
Line 3,118: Line 3,117:
n->if(sma_i++>#sma_v,sma_v[sma_i=1]=n;0,sma_v[sma_i]=n;0)+sum(i=1,#sma_v,sma_v[i])/#sma_v
n->if(sma_i++>#sma_v,sma_v[sma_i=1]=n;0,sma_v[sma_i]=n;0)+sum(i=1,#sma_v,sma_v[i])/#sma_v
};</lang>
};</lang>

=={{header|Pascal}}==
=={{header|Pascal}}==
{{works with|Free Pascal}}
{{works with|Free Pascal}}
Line 3,215: Line 3,215:


real 0m0.780s { 64-Bit }</pre>
real 0m0.780s { 64-Bit }</pre>

=={{header|Perl}}==
=={{header|Perl}}==


Line 3,242: Line 3,243:
append 1 --> sma = 1.00 (with period 3)
append 1 --> sma = 1.00 (with period 3)
append 2 --> sma = 1.50 (with period 3)
append 2 --> sma = 1.50 (with period 3)
append 3 --> sma = 2.00 (with period 3)
append 2 --> sma = 2.33 (with period 3)
append 7 --> sma = 4.00 (with period 3)
</pre>

=={{header|Perl 6}}==

{{works with|Rakudo|2016.08}}
<lang perl6>sub sma-generator (Int $P where * > 0) {
sub ($x) {
state @a = 0 xx $P;
@a.push($x).shift;
@a.sum / $P;
}
}

# Usage:
my &sma = sma-generator 3;

for 1, 2, 3, 2, 7 {
printf "append $_ --> sma = %.2f (with period 3)\n", sma $_;
}</lang>

{{out}}
<pre>
append 1 --> sma = 0.33 (with period 3)
append 2 --> sma = 1.00 (with period 3)
append 3 --> sma = 2.00 (with period 3)
append 3 --> sma = 2.00 (with period 3)
append 2 --> sma = 2.33 (with period 3)
append 2 --> sma = 2.33 (with period 3)
Line 3,685: Line 3,659:
(values (sma3 i) (sma5 i)))
(values (sma3 i) (sma5 i)))
</lang>
</lang>

=={{header|Raku}}==
(formerly Perl 6)

{{works with|Rakudo|2016.08}}
<lang perl6>sub sma-generator (Int $P where * > 0) {
sub ($x) {
state @a = 0 xx $P;
@a.push($x).shift;
@a.sum / $P;
}
}

# Usage:
my &sma = sma-generator 3;

for 1, 2, 3, 2, 7 {
printf "append $_ --> sma = %.2f (with period 3)\n", sma $_;
}</lang>

{{out}}
<pre>
append 1 --> sma = 0.33 (with period 3)
append 2 --> sma = 1.00 (with period 3)
append 3 --> sma = 2.00 (with period 3)
append 2 --> sma = 2.33 (with period 3)
append 7 --> sma = 4.00 (with period 3)
</pre>


=={{header|REXX}}==
=={{header|REXX}}==
Line 3,950: Line 3,952:
num, ma3 << num, ma5 <<num
num, ma3 << num, ma5 <<num
end</lang>
end</lang>

=={{header|Run Basic}}==
<lang runbasic>data 1,2,3,4,5,5,4,3,2,1
dim sd(10) ' series data
global sd ' make it global so we all see it
for i = 1 to 10:read sd(i): next i

x = sma(3) ' simple moving average for 3 periods
x = sma(5) ' simple moving average for 5 periods

function sma(p) ' the simple moving average function
print "----- SMA:";p;" -----"
for i = 1 to 10
sumSd = 0
for j = max((i - p) + 1,1) to i
sumSd = sumSd + sd(j) ' sum series data for the period
next j
if p > i then p1 = i else p1 = p
print sd(i);" sma:";p;" ";sumSd / p1
next i
end function</lang>
<pre>----- SMA:3 -----
1 sma:3 1
2 sma:3 1.5
3 sma:3 2
4 sma:3 3
5 sma:3 4
5 sma:3 4.6666665
4 sma:3 4.6666665
3 sma:3 4
2 sma:3 3
1 sma:3 2
----- SMA:5 -----
1 sma:5 1
2 sma:5 1.5
3 sma:5 2
4 sma:5 2.5
5 sma:5 3
5 sma:5 3.79999995
4 sma:5 4.1999998
3 sma:5 4.1999998
2 sma:5 3.79999995
1 sma:5 3</pre>

=={{header|Rust}}==
=={{header|Rust}}==
===Vector Based===
===Vector Based===
Line 4,058: Line 4,104:
Number: 1 | Average: 3
Number: 1 | Average: 3
</pre>
</pre>

=={{header|Run Basic}}==
<lang runbasic>data 1,2,3,4,5,5,4,3,2,1
dim sd(10) ' series data
global sd ' make it global so we all see it
for i = 1 to 10:read sd(i): next i

x = sma(3) ' simple moving average for 3 periods
x = sma(5) ' simple moving average for 5 periods

function sma(p) ' the simple moving average function
print "----- SMA:";p;" -----"
for i = 1 to 10
sumSd = 0
for j = max((i - p) + 1,1) to i
sumSd = sumSd + sd(j) ' sum series data for the period
next j
if p > i then p1 = i else p1 = p
print sd(i);" sma:";p;" ";sumSd / p1
next i
end function</lang>
<pre>----- SMA:3 -----
1 sma:3 1
2 sma:3 1.5
3 sma:3 2
4 sma:3 3
5 sma:3 4
5 sma:3 4.6666665
4 sma:3 4.6666665
3 sma:3 4
2 sma:3 3
1 sma:3 2
----- SMA:5 -----
1 sma:5 1
2 sma:5 1.5
3 sma:5 2
4 sma:5 2.5
5 sma:5 3
5 sma:5 3.79999995
4 sma:5 4.1999998
3 sma:5 4.1999998
2 sma:5 3.79999995
1 sma:5 3</pre>


=={{header|Scala}}==
=={{header|Scala}}==
Line 4,162: Line 4,165:
(1 3/2 2 3 4 14/3 14/3 4 3 2)
(1 3/2 2 3 4 14/3 14/3 4 3 2)
</pre>
</pre>



=={{header|Sidef}}==
=={{header|Sidef}}==
Line 4,480: Line 4,482:
9 3,00000 3,80000
9 3,00000 3,80000
10 2,00000 3,00000</pre>
10 2,00000 3,00000</pre>

=={{header|VBScript}}==
=={{header|VBScript}}==
<lang vb>data = "1,2,3,4,5,5,4,3,2,1"
<lang vb>data = "1,2,3,4,5,5,4,3,2,1"