mc_forecast 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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