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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82e81b59b88ffa6eadba70aef437ecec5c040b890b19d7f64f8237eb59fc7c56
4
- data.tar.gz: 729b9f9d931b338f5860427d1aaba73aea35c847eedb018d72c39a7486c7f551
3
+ metadata.gz: 699d3557e6c13728ecad8b44aa145dc54f2aa6afdf2d007b9ad52429423687be
4
+ data.tar.gz: 3472b10896989b22c91cfdc5213f2b1600dd46057c3d9390b9403a1f048a77b4
5
5
  SHA512:
6
- metadata.gz: 4ce13d962a1c9e82f52e101387f6c8627fdac52187000e5ceb5a25bc7513bc9929cd94d6fc6faaf5196f7bcc90336bb69be642c774abe93a205b43464bbc20f1
7
- data.tar.gz: ea2d982df7f53a36558969c1d8361ea477d817895f92a4118cb23472eaa3066b85ce9efffcc12f804894facf1303f8dffe68c2b2bb9fd8865125d0ba516a41fd
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
- # sum: { mean: ...,
29
- # quantiles:
30
- # { 0.025: ..., 0.975: ... }},
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
  {
@@ -1,3 +1,3 @@
1
1
  module McForecast
2
- VERSION = "0.2.0".freeze
2
+ VERSION = "0.2.1".freeze
3
3
  end
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.0
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-03-19 00:00:00.000000000 Z
11
+ date: 2024-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_dup