timeprice 0.6.0 → 0.7.0

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/README.md +33 -2
  4. data/data/cpi/au.json +419 -0
  5. data/data/cpi/ca.json +1501 -0
  6. data/data/cpi/cn.json +487 -0
  7. data/data/cpi/eu.json +1 -1
  8. data/data/cpi/jp.json +1 -1
  9. data/data/cpi/kr.json +549 -0
  10. data/data/cpi/ru.json +487 -0
  11. data/data/cpi/uk.json +1 -1
  12. data/data/cpi/us.json +1 -1
  13. data/data/cpi/vn.json +26 -26
  14. data/data/fx/usd/1999.json +1042 -262
  15. data/data/fx/usd/2000.json +1274 -258
  16. data/data/fx/usd/2001.json +1277 -257
  17. data/data/fx/usd/2002.json +1282 -258
  18. data/data/fx/usd/2003.json +1282 -258
  19. data/data/fx/usd/2004.json +1302 -262
  20. data/data/fx/usd/2005.json +1292 -260
  21. data/data/fx/usd/2006.json +1282 -258
  22. data/data/fx/usd/2007.json +1282 -258
  23. data/data/fx/usd/2008.json +1287 -259
  24. data/data/fx/usd/2009.json +1287 -259
  25. data/data/fx/usd/2010.json +1297 -261
  26. data/data/fx/usd/2011.json +1292 -260
  27. data/data/fx/usd/2012.json +1287 -259
  28. data/data/fx/usd/2013.json +1282 -258
  29. data/data/fx/usd/2014.json +1282 -258
  30. data/data/fx/usd/2015.json +1287 -259
  31. data/data/fx/usd/2016.json +1292 -260
  32. data/data/fx/usd/2017.json +1282 -258
  33. data/data/fx/usd/2018.json +1282 -258
  34. data/data/fx/usd/2019.json +1282 -258
  35. data/data/fx/usd/2020.json +1292 -260
  36. data/data/fx/usd/2021.json +1297 -261
  37. data/data/fx/usd/2022.json +1292 -260
  38. data/data/fx/usd/2023.json +1282 -258
  39. data/data/fx/usd/2024.json +1287 -259
  40. data/data/fx/usd/2025.json +1282 -258
  41. data/data/fx/usd/2026.json +457 -92
  42. data/data/fx/usd/_annual.json +46 -1
  43. data/data/manifest.json +155 -7
  44. data/lib/timeprice/cli.rb +3 -3
  45. data/lib/timeprice/compare.rb +36 -3
  46. data/lib/timeprice/cpi_lookup.rb +4 -4
  47. data/lib/timeprice/data_loader.rb +8 -17
  48. data/lib/timeprice/date.rb +62 -0
  49. data/lib/timeprice/exchange.rb +49 -23
  50. data/lib/timeprice/inflation.rb +12 -4
  51. data/lib/timeprice/metadata.rb +121 -0
  52. data/lib/timeprice/metadata_snapshot.rb +23 -0
  53. data/lib/timeprice/point.rb +11 -3
  54. data/lib/timeprice/schema.rb +78 -0
  55. data/lib/timeprice/version.rb +1 -1
  56. data/lib/timeprice.rb +14 -1
  57. metadata +24 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f350843e8e12653e2f798d8f9afec193001e911e0f36910d0473724f33d79f8
4
- data.tar.gz: 3d1107eb101dd95ec6c2203fe6f1843f9249cf5046cf838577094c67a0fe63c0
3
+ metadata.gz: a991e47e7ddcc1b8a88a2be8e8a3850406f1a17bb9f6e0c69164bb25dcdb3fb8
4
+ data.tar.gz: b5d95ebc9b318b9165e32712142906539e230939e8a0e4bdbd2157ad89c247b9
5
5
  SHA512:
6
- metadata.gz: a7efbb6d151b4fd4c9c6d4697fc9c755c9a0d2e6b8e1e32d828a1416737dbfbd00d9143c64edde191eaea3f7f758b96ac1d4b93c9f765fbc5d0993bf68b0be7a
7
- data.tar.gz: 3a5b598b62cf93b992ed4ba5d069f84475c91a0be636600451fb3247caaa5c494c44b39268ed5e6107c34f923606521d42374d3300de42ad5a7449f53ae37e39
6
+ metadata.gz: f740a51b83681979a0b1a4b505bae66a4e266df69ba7064df53f50b783e5fd5d3ebfe3b4aea30452c4e216987f0248eb39c4f1e357c5df9ac7b439dc630593b5
7
+ data.tar.gz: 3f5e18ad1ef50e16636f63a7bc96e9bb2fda2ca8b7b7235b2c6534365d82ab0ca53bc24fc5e0d8188a86b5a1d36b5c80522c6f62a37d79d06c4b42f3da71f449
data/CHANGELOG.md CHANGED
@@ -5,6 +5,52 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ### Breaking changes (planned for 1.0.0)
9
+ - Public API methods (`inflation`, `exchange`, `compare`) now accept
10
+ `Timeprice::Date` in addition to strings. The accepted string formats
11
+ (`YYYY`, `YYYY-MM`, `YYYY-Qn`, `YYYY-MM-DD`) are unchanged. Unparseable
12
+ input now raises `Timeprice::InvalidDate` instead of a generic
13
+ `ArgumentError` at the boundary.
14
+ - `Timeprice.metadata` returns a `MetadataSnapshot` value object. Hash
15
+ access (`meta[:countries]`), `to_h`, and `JSON.generate(meta)` keep
16
+ working — the wire shape is byte-identical. New code should treat the
17
+ result as a frozen `Data` instance.
18
+ - `Timeprice::Point` gains `Point.parse(currency, date)` as the
19
+ canonical constructor; it routes the date through `Timeprice::Date`.
20
+ - Implementation modules (`Timeprice::Inflation`, `::Exchange`,
21
+ `::Compare`, `::Metadata`) are marked `@api private`. They will be
22
+ relocated to `Timeprice::Internal::` in a future major release; depend
23
+ on the `Timeprice.<method>` facade.
24
+
25
+ ## [0.7.0] - 2026-05-15
26
+
27
+ ### Fixed
28
+ - `Exchange.resolve_rate` no longer raises `DataNotFound` when one
29
+ triangulation leg falls back to the annual rate and the other resolves
30
+ on a daily date. Annual rates are year-wide, so they now adopt the
31
+ daily leg's effective date. Daily-vs-daily mismatches still raise.
32
+ - `Compare.run` short-circuits CPI with `cpi_ratio: 1.0` when both
33
+ points share a date — there's no time-elapsed inflation to apply, and
34
+ the daily `YYYY-MM-DD` grain that this path produces would otherwise
35
+ blow up CPI's monthly-max lookup.
36
+ - Web UI: `humaniseError` now recognises `DataNotFound`, FX
37
+ triangulation, and "No FX rate" patterns so a Ruby backtrace can no
38
+ longer surface in the result block.
39
+
40
+ ### Refactor (internal)
41
+ - `Timeprice::Schema` owns the on-disk format definition; both the
42
+ reader (DataLoader) and the writer (data pipeline) reference it.
43
+ - Data pipeline moved from `scripts/` to `tools/data_pipeline/`. Run via
44
+ `bundle exec rake data:refresh` and `bundle exec rake data:check_schema`.
45
+ - Provider self-registration replaces the hand-written orchestration
46
+ list. Seven World Bank CPI subclasses collapsed into a factory call.
47
+ - `Tools::DataPipeline::Series` value object replaces positional
48
+ `[monthly, annual]` / `[monthly, quarterly, annual]` returns.
49
+ - Typed `Tools::DataPipeline::Error` hierarchy (HttpError, ShapeError,
50
+ ValidationError, SchemaError) replaces bare string raises.
51
+ - Adopted the Weirich convention: `fail` for new exceptions, `raise` for
52
+ re-throws inside rescue blocks.
53
+
8
54
  ## [0.6.0] - 2026-05-12
9
55
 
10
56
  ### Added
data/README.md CHANGED
@@ -6,6 +6,10 @@ Offline historical inflation & FX for Ruby — bundled data, no API keys, monthl
6
6
  [![Gem Version](https://img.shields.io/gem/v/timeprice.svg)](https://rubygems.org/gems/timeprice)
7
7
  [![Ruby](https://img.shields.io/badge/ruby-%3E%3D%203.2-ruby.svg)](https://www.ruby-lang.org/)
8
8
 
9
+ **Try it without installing anything → [patrick204nqh.github.io/timeprice](https://patrick204nqh.github.io/timeprice/).** The page boots the gem in your browser via ruby.wasm — same code, same numbers, no backend.
10
+
11
+ [![timeprice calculator screenshot](docs/img/calculator.png)](https://patrick204nqh.github.io/timeprice/)
12
+
9
13
  ## Why this exists
10
14
 
11
15
  Every other "historical inflation / FX" library wants you to wire up an API key, eat a rate
@@ -88,6 +92,33 @@ r.cpi_ratio # => 1.897026680414...
88
92
  All result objects are `Data.define` value objects — they support `.to_h`, `==`, and
89
93
  pattern matching, so you can hand them to JSON, RSpec, or `case/in` without ceremony.
90
94
 
95
+ ### Introspection: `Timeprice.metadata`
96
+
97
+ `Timeprice.metadata` returns a frozen, JSON-serialisable snapshot of the bundled
98
+ dataset — version, refresh date, country list with per-granularity CPI ranges, currency
99
+ list, and FX daily coverage. Use it to populate dropdowns or validate date inputs
100
+ without hardcoding what the gem already knows.
101
+
102
+ ```ruby
103
+ Timeprice.metadata
104
+ # => {
105
+ # version: "0.7.0",
106
+ # generated_at: "2026-05-12",
107
+ # countries: [
108
+ # { code: "US", name: "United States", currency: "USD",
109
+ # granularities: ["monthly", "annual"],
110
+ # cpi: { monthly: { min: "1990-01", max: "2026-03" },
111
+ # annual: { min: "1990", max: "2024" } } },
112
+ # ...
113
+ # ],
114
+ # currencies: [{ code: "USD", name: "US dollar" }, ...],
115
+ # fx: { base: "USD", daily_min: "1999-01-04", daily_max: "2026-05-11" }
116
+ # }
117
+ ```
118
+
119
+ The browser calculator linked at the top of this README is the canonical consumer —
120
+ it reads metadata at boot so the UI never disagrees with the dataset.
121
+
91
122
  ## Supported countries, currencies, and data ranges
92
123
 
93
124
  Coverage is derived from the bundled `data/` files. Re-check with `timeprice sources`.
@@ -102,7 +133,7 @@ Coverage is derived from the bundled `data/` files. Re-check with `timeprice sou
102
133
  | Australia | AUD | ABS 6401.0 (quarterly) + World Bank `FP.CPI.TOTL` (annual baseline) | Quarterly + annual | 1948-Q3 → present |
103
134
  | Canada | CAD | Statistics Canada WDS (table 18-10-0004-01, vector `v41690973`) + World Bank annual baseline | Monthly + annual | 1914-01 → present |
104
135
  | Korea (Rep.) | KRW | IMF Data Portal CPI dataflow + World Bank annual baseline | Monthly + annual | 1990-01 → present |
105
- | China | CNY | World Bank `FP.CPI.TOTL` (annual primary) + IMF Data Portal CPI dataflow (monthly layer) | Monthly + annual | 1990-01 → present |
136
+ | China | CNY | World Bank `FP.CPI.TOTL` (annual primary) + IMF Data Portal CPI dataflow (monthly layer) | Monthly + annual | 1993-01 → present |
106
137
  | Russia | RUB | World Bank `FP.CPI.TOTL` (annual primary) + IMF Data Portal CPI dataflow (monthly layer) | Monthly + annual | 1992-01 → present |
107
138
 
108
139
  **FX (USD base):** ECB reference rates via Frankfurter for **EUR / GBP / JPY / AUD /
@@ -287,7 +318,7 @@ Bundled data lives under `data/` in schema v3 and is self-describing:
287
318
  currencies sourced at annual resolution (today only VND). Used as the
288
319
  fallback tier when no daily rate covers the requested date.
289
320
 
290
- `scripts/check_schema_stability.rb` enforces the shape in CI.
321
+ `tools/data_pipeline/schema_check.rb` enforces the shape in CI.
291
322
 
292
323
  ## Author
293
324
 
data/data/cpi/au.json ADDED
@@ -0,0 +1,419 @@
1
+ {
2
+ "country": "AU",
3
+ "index": {
4
+ "base_period": "2010",
5
+ "rebased_at": null
6
+ },
7
+ "provenance": [
8
+ {
9
+ "from": "1948-Q3",
10
+ "provider": "abs",
11
+ "series": "quarterly",
12
+ "to": "2026-Q1"
13
+ },
14
+ {
15
+ "from": "1960",
16
+ "provider": "world_bank",
17
+ "series": "annual",
18
+ "to": "2024"
19
+ }
20
+ ],
21
+ "providers": [
22
+ {
23
+ "fetched_at": "2026-05-12",
24
+ "id": "world_bank",
25
+ "label": "World Bank FP.CPI.TOTL (annual, AU baseline)",
26
+ "status": "ok"
27
+ },
28
+ {
29
+ "fetched_at": "2026-05-12",
30
+ "id": "abs",
31
+ "label": "ABS 6401.0 Consumer Price Index (quarterly) + World Bank (annual baseline)",
32
+ "status": "ok"
33
+ }
34
+ ],
35
+ "schema_version": 4,
36
+ "series": {
37
+ "annual": {
38
+ "1960": 7.96045859451027,
39
+ "1961": 8.14256048564101,
40
+ "1962": 8.11654592976519,
41
+ "1963": 8.16857504151683,
42
+ "1964": 8.40270492027182,
43
+ "1965": 8.68886615903322,
44
+ "1966": 8.97502627366723,
45
+ "1967": 9.28720094417707,
46
+ "1968": 9.52133194705944,
47
+ "1969": 9.83350661756927,
48
+ "1970": 10.1716958439549,
49
+ "1971": 10.7960455596837,
50
+ "1972": 11.4464105807065,
51
+ "1973": 12.4869928157393,
52
+ "1974": 14.4120721988047,
53
+ "1975": 16.5972911452823,
54
+ "1976": 18.8085321418182,
55
+ "1977": 21.1238298630209,
56
+ "1978": 22.8147722478579,
57
+ "1979": 24.8959404650147,
58
+ "1980": 27.4193553826422,
59
+ "1981": 30.0208109702242,
60
+ "1982": 33.4287230358843,
61
+ "1983": 36.7845992450285,
62
+ "1984": 38.2414196200022,
63
+ "1985": 40.8168591528718,
64
+ "1986": 44.5109290849112,
65
+ "1987": 48.3090482474348,
66
+ "1988": 51.7950084772319,
67
+ "1989": 55.6971918586048,
68
+ "1990": 59.7814801287815,
69
+ "1991": 61.6805397100433,
70
+ "1992": 62.3048875522264,
71
+ "1993": 63.3975018966839,
72
+ "1994": 64.6462013281415,
73
+ "1995": 67.6378752538607,
74
+ "1996": 69.4068620557434,
75
+ "1997": 69.5629546369261,
76
+ "1998": 70.1612864243969,
77
+ "1999": 71.2018761536123,
78
+ "2000": 74.3756549681352,
79
+ "2001": 77.6534867602337,
80
+ "2002": 79.9687807343452,
81
+ "2003": 82.1540056761687,
82
+ "2004": 84.0790850592342,
83
+ "2005": 86.3423506710122,
84
+ "2006": 89.4120690137771,
85
+ "2007": 91.493237230934,
86
+ "2008": 95.4734650293526,
87
+ "2009": 97.1644149083721,
88
+ "2010": 99.9999999999999,
89
+ "2011": 103.30384784681,
90
+ "2012": 105.124870505209,
91
+ "2013": 107.700306290987,
92
+ "2014": 110.379813789798,
93
+ "2015": 112.044747614105,
94
+ "2016": 113.475551934366,
95
+ "2017": 115.686785436719,
96
+ "2018": 117.898022686164,
97
+ "2019": 119.797089761608,
98
+ "2020": 120.811652194838,
99
+ "2021": 124.271592622831,
100
+ "2022": 132.466181470806,
101
+ "2023": 139.880337389597,
102
+ "2024": 144.309741509281
103
+ },
104
+ "monthly": {},
105
+ "quarterly": {
106
+ "1948-Q3": 2.59,
107
+ "1948-Q4": 2.63,
108
+ "1949-Q1": 2.71,
109
+ "1949-Q2": 2.74,
110
+ "1949-Q3": 2.82,
111
+ "1949-Q4": 2.86,
112
+ "1950-Q1": 2.9,
113
+ "1950-Q2": 3.02,
114
+ "1950-Q3": 3.05,
115
+ "1950-Q4": 3.17,
116
+ "1951-Q1": 3.32,
117
+ "1951-Q2": 3.52,
118
+ "1951-Q3": 3.71,
119
+ "1951-Q4": 3.98,
120
+ "1952-Q1": 4.1,
121
+ "1952-Q2": 4.25,
122
+ "1952-Q3": 4.33,
123
+ "1952-Q4": 4.37,
124
+ "1953-Q1": 4.41,
125
+ "1953-Q2": 4.45,
126
+ "1953-Q3": 4.48,
127
+ "1953-Q4": 4.45,
128
+ "1954-Q1": 4.48,
129
+ "1954-Q2": 4.48,
130
+ "1954-Q3": 4.48,
131
+ "1954-Q4": 4.48,
132
+ "1955-Q1": 4.52,
133
+ "1955-Q2": 4.56,
134
+ "1955-Q3": 4.6,
135
+ "1955-Q4": 4.64,
136
+ "1956-Q1": 4.68,
137
+ "1956-Q2": 4.83,
138
+ "1956-Q3": 4.95,
139
+ "1956-Q4": 4.95,
140
+ "1957-Q1": 4.95,
141
+ "1957-Q2": 4.99,
142
+ "1957-Q3": 4.99,
143
+ "1957-Q4": 4.99,
144
+ "1958-Q1": 5.03,
145
+ "1958-Q2": 5.03,
146
+ "1958-Q3": 5.03,
147
+ "1958-Q4": 5.06,
148
+ "1959-Q1": 5.1,
149
+ "1959-Q2": 5.1,
150
+ "1959-Q3": 5.14,
151
+ "1959-Q4": 5.18,
152
+ "1960-Q1": 5.22,
153
+ "1960-Q2": 5.3,
154
+ "1960-Q3": 5.37,
155
+ "1960-Q4": 5.41,
156
+ "1961-Q1": 5.45,
157
+ "1961-Q2": 5.49,
158
+ "1961-Q3": 5.45,
159
+ "1961-Q4": 5.45,
160
+ "1962-Q1": 5.45,
161
+ "1962-Q2": 5.45,
162
+ "1962-Q3": 5.45,
163
+ "1962-Q4": 5.45,
164
+ "1963-Q1": 5.45,
165
+ "1963-Q2": 5.45,
166
+ "1963-Q3": 5.49,
167
+ "1963-Q4": 5.49,
168
+ "1964-Q1": 5.53,
169
+ "1964-Q2": 5.57,
170
+ "1964-Q3": 5.64,
171
+ "1964-Q4": 5.68,
172
+ "1965-Q1": 5.72,
173
+ "1965-Q2": 5.8,
174
+ "1965-Q3": 5.84,
175
+ "1965-Q4": 5.91,
176
+ "1966-Q1": 5.95,
177
+ "1966-Q2": 5.99,
178
+ "1966-Q3": 5.99,
179
+ "1966-Q4": 6.07,
180
+ "1967-Q1": 6.11,
181
+ "1967-Q2": 6.15,
182
+ "1967-Q3": 6.26,
183
+ "1967-Q4": 6.26,
184
+ "1968-Q1": 6.3,
185
+ "1968-Q2": 6.34,
186
+ "1968-Q3": 6.38,
187
+ "1968-Q4": 6.42,
188
+ "1969-Q1": 6.49,
189
+ "1969-Q2": 6.53,
190
+ "1969-Q3": 6.57,
191
+ "1969-Q4": 6.61,
192
+ "1970-Q1": 6.69,
193
+ "1970-Q2": 6.77,
194
+ "1970-Q3": 6.8,
195
+ "1970-Q4": 6.92,
196
+ "1971-Q1": 7.0,
197
+ "1971-Q2": 7.11,
198
+ "1971-Q3": 7.27,
199
+ "1971-Q4": 7.42,
200
+ "1972-Q1": 7.5,
201
+ "1972-Q2": 7.58,
202
+ "1972-Q3": 7.69,
203
+ "1972-Q4": 7.77,
204
+ "1973-Q1": 7.93,
205
+ "1973-Q2": 8.2,
206
+ "1973-Q3": 8.47,
207
+ "1973-Q4": 8.78,
208
+ "1974-Q1": 9.01,
209
+ "1974-Q2": 9.39,
210
+ "1974-Q3": 9.86,
211
+ "1974-Q4": 10.21,
212
+ "1975-Q1": 10.59,
213
+ "1975-Q2": 10.98,
214
+ "1975-Q3": 11.06,
215
+ "1975-Q4": 11.68,
216
+ "1976-Q1": 11.98,
217
+ "1976-Q2": 12.29,
218
+ "1976-Q3": 12.6,
219
+ "1976-Q4": 13.34,
220
+ "1977-Q1": 13.65,
221
+ "1977-Q2": 13.96,
222
+ "1977-Q3": 14.23,
223
+ "1977-Q4": 14.57,
224
+ "1978-Q1": 14.77,
225
+ "1978-Q2": 15.08,
226
+ "1978-Q3": 15.35,
227
+ "1978-Q4": 15.7,
228
+ "1979-Q1": 15.97,
229
+ "1979-Q2": 16.39,
230
+ "1979-Q3": 16.78,
231
+ "1979-Q4": 17.28,
232
+ "1980-Q1": 17.67,
233
+ "1980-Q2": 18.17,
234
+ "1980-Q3": 18.48,
235
+ "1980-Q4": 18.87,
236
+ "1981-Q1": 19.33,
237
+ "1981-Q2": 19.76,
238
+ "1981-Q3": 20.14,
239
+ "1981-Q4": 20.99,
240
+ "1982-Q1": 21.38,
241
+ "1982-Q2": 21.88,
242
+ "1982-Q3": 22.65,
243
+ "1982-Q4": 23.31,
244
+ "1983-Q1": 23.81,
245
+ "1983-Q2": 24.32,
246
+ "1983-Q3": 24.74,
247
+ "1983-Q4": 25.32,
248
+ "1984-Q1": 25.21,
249
+ "1984-Q2": 25.28,
250
+ "1984-Q3": 25.59,
251
+ "1984-Q4": 25.98,
252
+ "1985-Q1": 26.33,
253
+ "1985-Q2": 26.95,
254
+ "1985-Q3": 27.56,
255
+ "1985-Q4": 28.11,
256
+ "1986-Q1": 28.76,
257
+ "1986-Q2": 29.23,
258
+ "1986-Q3": 30.0,
259
+ "1986-Q4": 30.85,
260
+ "1987-Q1": 31.47,
261
+ "1987-Q2": 31.93,
262
+ "1987-Q3": 32.47,
263
+ "1987-Q4": 33.05,
264
+ "1988-Q1": 33.63,
265
+ "1988-Q2": 34.21,
266
+ "1988-Q3": 34.87,
267
+ "1988-Q4": 35.57,
268
+ "1989-Q1": 35.91,
269
+ "1989-Q2": 36.8,
270
+ "1989-Q3": 37.65,
271
+ "1989-Q4": 38.35,
272
+ "1990-Q1": 39.01,
273
+ "1990-Q2": 39.63,
274
+ "1990-Q3": 39.94,
275
+ "1990-Q4": 40.98,
276
+ "1991-Q1": 40.9,
277
+ "1991-Q2": 40.98,
278
+ "1991-Q3": 41.21,
279
+ "1991-Q4": 41.6,
280
+ "1992-Q1": 41.6,
281
+ "1992-Q2": 41.48,
282
+ "1992-Q3": 41.52,
283
+ "1992-Q4": 41.71,
284
+ "1993-Q1": 42.1,
285
+ "1993-Q2": 42.25,
286
+ "1993-Q3": 42.45,
287
+ "1993-Q4": 42.53,
288
+ "1994-Q1": 42.68,
289
+ "1994-Q2": 42.99,
290
+ "1994-Q3": 43.26,
291
+ "1994-Q4": 43.61,
292
+ "1995-Q1": 44.34,
293
+ "1995-Q2": 44.92,
294
+ "1995-Q3": 45.46,
295
+ "1995-Q4": 45.81,
296
+ "1996-Q1": 46.0,
297
+ "1996-Q2": 46.31,
298
+ "1996-Q3": 46.43,
299
+ "1996-Q4": 46.51,
300
+ "1997-Q1": 46.58,
301
+ "1997-Q2": 46.47,
302
+ "1997-Q3": 46.28,
303
+ "1997-Q4": 46.39,
304
+ "1998-Q1": 46.51,
305
+ "1998-Q2": 46.78,
306
+ "1998-Q3": 46.91,
307
+ "1998-Q4": 47.11,
308
+ "1999-Q1": 47.08,
309
+ "1999-Q2": 47.29,
310
+ "1999-Q3": 47.72,
311
+ "1999-Q4": 47.97,
312
+ "2000-Q1": 48.4,
313
+ "2000-Q2": 48.77,
314
+ "2000-Q3": 50.59,
315
+ "2000-Q4": 50.76,
316
+ "2001-Q1": 51.3,
317
+ "2001-Q2": 51.73,
318
+ "2001-Q3": 51.87,
319
+ "2001-Q4": 52.35,
320
+ "2002-Q1": 52.82,
321
+ "2002-Q2": 53.2,
322
+ "2002-Q3": 53.56,
323
+ "2002-Q4": 53.92,
324
+ "2003-Q1": 54.62,
325
+ "2003-Q2": 54.62,
326
+ "2003-Q3": 54.93,
327
+ "2003-Q4": 55.22,
328
+ "2004-Q1": 55.71,
329
+ "2004-Q2": 55.97,
330
+ "2004-Q3": 56.2,
331
+ "2004-Q4": 56.63,
332
+ "2005-Q1": 57.01,
333
+ "2005-Q2": 57.35,
334
+ "2005-Q3": 57.92,
335
+ "2005-Q4": 58.22,
336
+ "2006-Q1": 58.72,
337
+ "2006-Q2": 59.65,
338
+ "2006-Q3": 60.18,
339
+ "2006-Q4": 60.11,
340
+ "2007-Q1": 60.16,
341
+ "2007-Q2": 60.9,
342
+ "2007-Q3": 61.32,
343
+ "2007-Q4": 61.89,
344
+ "2008-Q1": 62.72,
345
+ "2008-Q2": 63.63,
346
+ "2008-Q3": 64.37,
347
+ "2008-Q4": 64.16,
348
+ "2009-Q1": 64.23,
349
+ "2009-Q2": 64.55,
350
+ "2009-Q3": 65.16,
351
+ "2009-Q4": 65.51,
352
+ "2010-Q1": 66.12,
353
+ "2010-Q2": 66.52,
354
+ "2010-Q3": 67.0,
355
+ "2010-Q4": 67.26,
356
+ "2011-Q1": 68.3,
357
+ "2011-Q2": 68.93,
358
+ "2011-Q3": 69.34,
359
+ "2011-Q4": 69.34,
360
+ "2012-Q1": 69.38,
361
+ "2012-Q2": 69.74,
362
+ "2012-Q3": 70.69,
363
+ "2012-Q4": 70.87,
364
+ "2013-Q1": 71.11,
365
+ "2013-Q2": 71.38,
366
+ "2013-Q3": 72.25,
367
+ "2013-Q4": 72.77,
368
+ "2014-Q1": 73.2,
369
+ "2014-Q2": 73.57,
370
+ "2014-Q3": 73.88,
371
+ "2014-Q4": 74.02,
372
+ "2015-Q1": 74.16,
373
+ "2015-Q2": 74.69,
374
+ "2015-Q3": 74.98,
375
+ "2015-Q4": 75.27,
376
+ "2016-Q1": 75.12,
377
+ "2016-Q2": 75.45,
378
+ "2016-Q3": 75.98,
379
+ "2016-Q4": 76.38,
380
+ "2017-Q1": 76.73,
381
+ "2017-Q2": 76.88,
382
+ "2017-Q3": 77.35,
383
+ "2017-Q4": 77.87,
384
+ "2018-Q1": 78.21,
385
+ "2018-Q2": 78.49,
386
+ "2018-Q3": 78.83,
387
+ "2018-Q4": 79.24,
388
+ "2019-Q1": 79.23,
389
+ "2019-Q2": 79.7,
390
+ "2019-Q3": 80.15,
391
+ "2019-Q4": 80.7,
392
+ "2020-Q1": 81.0,
393
+ "2020-Q2": 79.44,
394
+ "2020-Q3": 80.67,
395
+ "2020-Q4": 81.4,
396
+ "2021-Q1": 81.87,
397
+ "2021-Q2": 82.47,
398
+ "2021-Q3": 83.17,
399
+ "2021-Q4": 84.23,
400
+ "2022-Q1": 86.05,
401
+ "2022-Q2": 87.59,
402
+ "2022-Q3": 89.2,
403
+ "2022-Q4": 90.85,
404
+ "2023-Q1": 92.08,
405
+ "2023-Q2": 92.87,
406
+ "2023-Q3": 93.94,
407
+ "2023-Q4": 94.53,
408
+ "2024-Q1": 95.41,
409
+ "2024-Q2": 96.41,
410
+ "2024-Q3": 96.62,
411
+ "2024-Q4": 96.81,
412
+ "2025-Q1": 97.7,
413
+ "2025-Q2": 98.43,
414
+ "2025-Q3": 99.73,
415
+ "2025-Q4": 100.32,
416
+ "2026-Q1": 101.7
417
+ }
418
+ }
419
+ }