mc_forecast 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mc_forecast/simulation.rb +25 -6
- data/lib/mc_forecast/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 699d3557e6c13728ecad8b44aa145dc54f2aa6afdf2d007b9ad52429423687be
|
4
|
+
data.tar.gz: 3472b10896989b22c91cfdc5213f2b1600dd46057c3d9390b9403a1f048a77b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e9a931a1a95e631313addb817a29296250ce7085240695508c783e0e114c1280b69b1634f3b019d2936fcc99719d9ab69f9cac2382e85c3e36068f541196c0d
|
7
|
+
data.tar.gz: ea015bbd39ee328435c08ee99004d08b8ac37e12c41d466fd6520d10935fb91829efc14518c6576ab68dec09e74eeeec3de9907898ab3ecb126c77e180a2036e
|
@@ -2,7 +2,7 @@ require "deep_dup"
|
|
2
2
|
|
3
3
|
module McForecast
|
4
4
|
class Simulation
|
5
|
-
def run(init_state: nil, trials: 1_000, steps: 1, quantiles: [0.025, 0.16, 0.84, 0.975])
|
5
|
+
def run(init_state: nil, trials: 1_000, steps: 1, quantiles: [0.025, 0.16, 0.84, 0.975], ranges: [])
|
6
6
|
events = {}
|
7
7
|
(0..trials - 1).each do |trial|
|
8
8
|
state = DeepDup.deep_dup(init_state)
|
@@ -17,7 +17,7 @@ module McForecast
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
analyze(events, quantiles)
|
20
|
+
analyze(events, quantiles, ranges)
|
21
21
|
end
|
22
22
|
|
23
23
|
private
|
@@ -25,17 +25,21 @@ module McForecast
|
|
25
25
|
# Return an analysis of the events, containing:
|
26
26
|
# { event_name:
|
27
27
|
# {
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
28
|
+
# ranges: {
|
29
|
+
# 0..12: { mean: ..., quantiles: { 0.025: ..., 0.975: ... }},
|
30
|
+
# 13..24: { mean: ..., quantiles: { 0.025: ..., 0.975: ... }},
|
31
|
+
# ...
|
32
|
+
# },
|
33
|
+
# sum: { mean: ..., quantiles: { 0.025: ..., 0.975: ... }},
|
31
34
|
# mean: [...], # per step
|
32
35
|
# quantiles:
|
33
36
|
# { 0.025: [...],
|
34
37
|
# 0.975: [...]
|
35
38
|
# }}}
|
36
|
-
def analyze(events, quantiles)
|
39
|
+
def analyze(events, quantiles, ranges)
|
37
40
|
events.transform_values do |steps| # array(steps) of arrays(trials)
|
38
41
|
{
|
42
|
+
ranges: analyze_ranges(steps, quantiles, ranges),
|
39
43
|
sum: sum(steps, quantiles),
|
40
44
|
# besides the total sum we may want to have a sum for multiples of our base period
|
41
45
|
# (or week/month/quarter/year but that gets a bit complicated)
|
@@ -45,6 +49,21 @@ module McForecast
|
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
52
|
+
def analyze_ranges(steps, quantiles, ranges) # rubocop:disable Metrics/AbcSize
|
53
|
+
ranges.each_with_object({}) do |range, results|
|
54
|
+
range_sums = steps.slice(range).transpose.map(&:sum)
|
55
|
+
|
56
|
+
results[range] = {
|
57
|
+
mean: range_sums.sum.to_f / range_sums.length,
|
58
|
+
quantiles: quantiles.zip(
|
59
|
+
quantiles.map do |q|
|
60
|
+
range_sums.sort[(q * (range_sums.length - 1)).round.clamp(0, range_sums.length - 1)]
|
61
|
+
end
|
62
|
+
).to_h
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
48
67
|
def sum(steps, quantiles)
|
49
68
|
sums = steps.transpose.map(&:sum) # gives a sum of this event, per trial
|
50
69
|
{
|
data/lib/mc_forecast/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mc_forecast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daan van Vugt
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_dup
|