timeprice 0.6.0 → 0.8.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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -0
  3. data/README.md +73 -2
  4. data/data/cpi/au.json +419 -0
  5. data/data/cpi/br.json +529 -0
  6. data/data/cpi/ca.json +1501 -0
  7. data/data/cpi/ch.json +549 -0
  8. data/data/cpi/cn.json +487 -0
  9. data/data/cpi/cz.json +500 -0
  10. data/data/cpi/eu.json +1 -1
  11. data/data/cpi/hk.json +351 -0
  12. data/data/cpi/hu.json +537 -0
  13. data/data/cpi/id.json +550 -0
  14. data/data/cpi/il.json +549 -0
  15. data/data/cpi/in.json +549 -0
  16. data/data/cpi/jp.json +2 -2
  17. data/data/cpi/kr.json +550 -0
  18. data/data/cpi/mx.json +550 -0
  19. data/data/cpi/my.json +429 -0
  20. data/data/cpi/no.json +549 -0
  21. data/data/cpi/nz.json +94 -0
  22. data/data/cpi/ph.json +309 -0
  23. data/data/cpi/pl.json +539 -0
  24. data/data/cpi/ru.json +487 -0
  25. data/data/cpi/se.json +549 -0
  26. data/data/cpi/sg.json +369 -0
  27. data/data/cpi/th.json +309 -0
  28. data/data/cpi/tr.json +549 -0
  29. data/data/cpi/uk.json +1 -1
  30. data/data/cpi/us.json +1007 -5
  31. data/data/cpi/vn.json +32 -32
  32. data/data/cpi/za.json +549 -0
  33. data/data/fx/usd/1999.json +5982 -262
  34. data/data/fx/usd/2000.json +6999 -258
  35. data/data/fx/usd/2001.json +7142 -257
  36. data/data/fx/usd/2002.json +7170 -258
  37. data/data/fx/usd/2003.json +7170 -258
  38. data/data/fx/usd/2004.json +7282 -262
  39. data/data/fx/usd/2005.json +7226 -260
  40. data/data/fx/usd/2006.json +7170 -258
  41. data/data/fx/usd/2007.json +7169 -258
  42. data/data/fx/usd/2008.json +7184 -259
  43. data/data/fx/usd/2009.json +6941 -259
  44. data/data/fx/usd/2010.json +6995 -261
  45. data/data/fx/usd/2011.json +6968 -260
  46. data/data/fx/usd/2012.json +6941 -259
  47. data/data/fx/usd/2013.json +6914 -258
  48. data/data/fx/usd/2014.json +6914 -258
  49. data/data/fx/usd/2015.json +6941 -259
  50. data/data/fx/usd/2016.json +6968 -260
  51. data/data/fx/usd/2017.json +6914 -258
  52. data/data/fx/usd/2018.json +7148 -258
  53. data/data/fx/usd/2019.json +7170 -258
  54. data/data/fx/usd/2020.json +7226 -260
  55. data/data/fx/usd/2021.json +7254 -261
  56. data/data/fx/usd/2022.json +7226 -260
  57. data/data/fx/usd/2023.json +7170 -258
  58. data/data/fx/usd/2024.json +7198 -259
  59. data/data/fx/usd/2025.json +7170 -258
  60. data/data/fx/usd/2026.json +2561 -92
  61. data/data/fx/usd/_annual.json +46 -1
  62. data/data/manifest.json +565 -2
  63. data/lib/timeprice/cli/presenters/compare.rb +44 -8
  64. data/lib/timeprice/cli.rb +24 -7
  65. data/lib/timeprice/compare/series.rb +120 -0
  66. data/lib/timeprice/compare.rb +108 -15
  67. data/lib/timeprice/cpi_lookup.rb +14 -8
  68. data/lib/timeprice/data_loader.rb +8 -17
  69. data/lib/timeprice/date.rb +62 -0
  70. data/lib/timeprice/exchange.rb +49 -23
  71. data/lib/timeprice/forecast/cagr.rb +96 -0
  72. data/lib/timeprice/forecast/cpi_forecaster.rb +90 -0
  73. data/lib/timeprice/forecast/fx_forecaster.rb +173 -0
  74. data/lib/timeprice/forecast.rb +21 -0
  75. data/lib/timeprice/inflation.rb +12 -4
  76. data/lib/timeprice/metadata.rb +121 -0
  77. data/lib/timeprice/metadata_snapshot.rb +23 -0
  78. data/lib/timeprice/point.rb +11 -3
  79. data/lib/timeprice/schema.rb +78 -0
  80. data/lib/timeprice/sources.rb +1 -1
  81. data/lib/timeprice/supported.rb +16 -0
  82. data/lib/timeprice/version.rb +1 -1
  83. data/lib/timeprice.rb +48 -3
  84. metadata +49 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f350843e8e12653e2f798d8f9afec193001e911e0f36910d0473724f33d79f8
4
- data.tar.gz: 3d1107eb101dd95ec6c2203fe6f1843f9249cf5046cf838577094c67a0fe63c0
3
+ metadata.gz: 7bfb62351a8c29d487a50658a34b03b7c0e9843df0aaca6aa8ad677507379334
4
+ data.tar.gz: 70d41f26d096c44f5b72ff64327f80a58be49dab0705a4204e134e5b19c2eec0
5
5
  SHA512:
6
- metadata.gz: a7efbb6d151b4fd4c9c6d4697fc9c755c9a0d2e6b8e1e32d828a1416737dbfbd00d9143c64edde191eaea3f7f758b96ac1d4b93c9f765fbc5d0993bf68b0be7a
7
- data.tar.gz: 3a5b598b62cf93b992ed4ba5d069f84475c91a0be636600451fb3247caaa5c494c44b39268ed5e6107c34f923606521d42374d3300de42ad5a7449f53ae37e39
6
+ metadata.gz: d59d8b5bb6f74cb0b3dafca722df096647b149720a0bbde8c31679511f6e8ec0cd62940627f1c8b87ebca147f5a453610e75092b7ec9182dee43364f91f442bf
7
+ data.tar.gz: 1d8b22a4e8b31e5ac92c0c476cc53ac20f696cb446c2ae4a93e4ae3c6a0e152a24d645be831940c0b2bdf30581d0f025124ff9d0eebb06d1cac8a1bcd427cf48
data/CHANGELOG.md CHANGED
@@ -5,6 +5,105 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.8.0] - 2026-05-17
9
+
10
+ ### Added
11
+ - **Offline forecasting past the bundled data.** New `Timeprice::Forecast`
12
+ module: `CpiForecaster.project` and `FxForecaster.project` use a
13
+ trailing-window CAGR for the point estimate and ±1σ of year-over-year
14
+ changes for the band. Pure-Ruby, deterministic, no network calls or
15
+ stats dependencies. Defaults: 10-year window for CPI, 5-year for FX;
16
+ horizon caps 5y CPI / 2y FX (caps raise `horizon_exceeds_cap`
17
+ warnings, they don't block). `Forecast::Result` is a frozen value
18
+ object with `value`, `low`, `high`, `projection_method`, `sigma_pct`,
19
+ `last_known_date`, `target_date`, `horizon_months`, `basis_kind`,
20
+ `warnings`. `Timeprice.forecast(...)` is the public dispatcher.
21
+ - `Timeprice.compare` accepts `forecast: true`; when the target date
22
+ is past the bundled CPI window the result carries a populated
23
+ `forecast: { basis_kind:, projection_method:, window_years:,
24
+ sigma_pct:, last_known_date:, horizon_months:, low:, high:,
25
+ warnings: }` block and `granularity: :forecast`.
26
+ - CLI: `timeprice compare --forecast` prints the range, basis, and
27
+ caveats; `--json` exposes the same fields machine-readably.
28
+ - `Timeprice::Compare.series_for(from:, to:, forecast:, amount:)` returns
29
+ annual sample points for the chart strip; forecast points carry
30
+ `:low` / `:high` for the ±1σ band.
31
+ - `rake forecast:backtest` reports per-country MAPE for the bundled
32
+ data with assertions, so accuracy regressions are caught in CI.
33
+
34
+ ### Web calculator
35
+ - Inline **📈 Forecast this date** affordance replaces the old form-level
36
+ checkbox. It only appears when the entered target year is past the
37
+ destination country's bundled CPI window. Clicking toggles
38
+ `state.form.forecast` and re-computes; the toggle round-trips through
39
+ the existing `&forecast=1` URL param.
40
+ - New SVG strip beneath the result paints the measured polyline, the
41
+ dashed forecast line, a striped ±1σ fan, and tick labels — answers
42
+ "how did we get this number?" visually.
43
+ - Amount input now carries locale thousands separators with a
44
+ caret-preserving live formatter; `parseAmount` strips them before
45
+ parsing.
46
+ - From/To rows reflow to `label + currency (60%) + 'in' + date (40%)`
47
+ on a single line, all three form rows ending at the same right edge.
48
+ - Footer meta line ("refreshed …, gem v…") now hydrates from
49
+ `Timeprice.metadata` at boot; the HTML carries placeholders only, so
50
+ releases no longer hand-edit the index.
51
+
52
+ ### Changed
53
+ - `thor` is now a development dependency, not a runtime dependency. The
54
+ CLI (`exe/timeprice`) still works exactly as before, but users who only
55
+ `require "timeprice"` as a library no longer pull in thor and its
56
+ transitive stdlib (`set`, `digest`, `erb`, etc.). The ruby.wasm site
57
+ bundle drops ~200 KB raw / ~55 KB gzipped. CLI users need to run
58
+ `gem install thor` once; `bin/timeprice` prints a clear hint if it's
59
+ missing.
60
+
61
+ ### Breaking changes (planned for 1.0.0)
62
+ - Public API methods (`inflation`, `exchange`, `compare`) now accept
63
+ `Timeprice::Date` in addition to strings. The accepted string formats
64
+ (`YYYY`, `YYYY-MM`, `YYYY-Qn`, `YYYY-MM-DD`) are unchanged. Unparseable
65
+ input now raises `Timeprice::InvalidDate` instead of a generic
66
+ `ArgumentError` at the boundary.
67
+ - `Timeprice.metadata` returns a `MetadataSnapshot` value object. Hash
68
+ access (`meta[:countries]`), `to_h`, and `JSON.generate(meta)` keep
69
+ working — the wire shape is byte-identical. New code should treat the
70
+ result as a frozen `Data` instance.
71
+ - `Timeprice::Point` gains `Point.parse(currency, date)` as the
72
+ canonical constructor; it routes the date through `Timeprice::Date`.
73
+ - Implementation modules (`Timeprice::Inflation`, `::Exchange`,
74
+ `::Compare`, `::Metadata`) are marked `@api private`. They will be
75
+ relocated to `Timeprice::Internal::` in a future major release; depend
76
+ on the `Timeprice.<method>` facade.
77
+
78
+ ## [0.7.0] - 2026-05-15
79
+
80
+ ### Fixed
81
+ - `Exchange.resolve_rate` no longer raises `DataNotFound` when one
82
+ triangulation leg falls back to the annual rate and the other resolves
83
+ on a daily date. Annual rates are year-wide, so they now adopt the
84
+ daily leg's effective date. Daily-vs-daily mismatches still raise.
85
+ - `Compare.run` short-circuits CPI with `cpi_ratio: 1.0` when both
86
+ points share a date — there's no time-elapsed inflation to apply, and
87
+ the daily `YYYY-MM-DD` grain that this path produces would otherwise
88
+ blow up CPI's monthly-max lookup.
89
+ - Web UI: `humaniseError` now recognises `DataNotFound`, FX
90
+ triangulation, and "No FX rate" patterns so a Ruby backtrace can no
91
+ longer surface in the result block.
92
+
93
+ ### Refactor (internal)
94
+ - `Timeprice::Schema` owns the on-disk format definition; both the
95
+ reader (DataLoader) and the writer (data pipeline) reference it.
96
+ - Data pipeline moved from `scripts/` to `tools/data_pipeline/`. Run via
97
+ `bundle exec rake data:refresh` and `bundle exec rake data:check_schema`.
98
+ - Provider self-registration replaces the hand-written orchestration
99
+ list. Seven World Bank CPI subclasses collapsed into a factory call.
100
+ - `Tools::DataPipeline::Series` value object replaces positional
101
+ `[monthly, annual]` / `[monthly, quarterly, annual]` returns.
102
+ - Typed `Tools::DataPipeline::Error` hierarchy (HttpError, ShapeError,
103
+ ValidationError, SchemaError) replaces bare string raises.
104
+ - Adopted the Weirich convention: `fail` for new exceptions, `raise` for
105
+ re-throws inside rescue blocks.
106
+
8
107
  ## [0.6.0] - 2026-05-12
9
108
 
10
109
  ### 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
@@ -28,6 +32,14 @@ gem "timeprice", "~> 0.1"
28
32
 
29
33
  Requires Ruby >= 3.2.
30
34
 
35
+ The CLI also needs the `thor` gem, kept out of timeprice's runtime
36
+ dependencies so library users (`require "timeprice"`) and the ruby.wasm
37
+ site bundle don't carry it:
38
+
39
+ ```bash
40
+ gem install thor
41
+ ```
42
+
31
43
  ## CLI examples
32
44
 
33
45
  ```bash
@@ -48,6 +60,38 @@ $ timeprice compare 100 --from "2010 USD" --to "2024 VND"
48
60
  -> inflate x1.8970 VN -> 3,530,921 VND (2024, annual)
49
61
  ```
50
62
 
63
+ ### Forecasting (target dates past the bundled data)
64
+
65
+ `compare` accepts target dates beyond the last bundled CPI / FX point when
66
+ you pass `--forecast` (CLI) or `forecast: true` (Ruby). The forecast uses a
67
+ trailing-window CAGR with a ±1σ band derived from historical year-over-year
68
+ volatility — no network calls, no stats dependencies, fully deterministic.
69
+
70
+ ```bash
71
+ $ timeprice compare 100 --from "2010 USD" --to "2030 VND" --forecast
72
+ 4,297,876 VND in 2030 (forecast)
73
+ 100.00 USD (2010)
74
+ -> fx @ 18,612.92 -> 1,861,292 VND (2010)
75
+ -> inflate x2.3091 VN -> 4,297,876 VND (2030, forecast)
76
+
77
+ range 4,133,277 VND — 4,297,876 VND — 4,467,270 VND
78
+ (low -1σ) (most likely) (high +1σ)
79
+
80
+ basis trailing 10y CAGR · last data 2026-03
81
+ sigma ±1.0%/yr · horizon +46mo
82
+ ```
83
+
84
+ Defaults: 10-year window for CPI, 5-year for FX. Horizon caps (5y CPI, 2y
85
+ FX) don't block the forecast — they raise a `horizon_exceeds_cap` warning
86
+ in the result. Run `bundle exec rake forecast:backtest` to see per-country
87
+ MAPE for the bundled data.
88
+
89
+ On the web calculator the forecast is opt-in per query: when you enter a
90
+ target date past the bundled CPI window, an inline **📈 Forecast this
91
+ date** button appears under the result. A small SVG strip below the result
92
+ visualises the measured series and, when forecast is on, a striped fan band
93
+ for the projected tail.
94
+
51
95
  The first line of each result is the answer — pipe through `head -1` if a
52
96
  script only needs the headline figure.
53
97
 
@@ -88,6 +132,33 @@ r.cpi_ratio # => 1.897026680414...
88
132
  All result objects are `Data.define` value objects — they support `.to_h`, `==`, and
89
133
  pattern matching, so you can hand them to JSON, RSpec, or `case/in` without ceremony.
90
134
 
135
+ ### Introspection: `Timeprice.metadata`
136
+
137
+ `Timeprice.metadata` returns a frozen, JSON-serialisable snapshot of the bundled
138
+ dataset — version, refresh date, country list with per-granularity CPI ranges, currency
139
+ list, and FX daily coverage. Use it to populate dropdowns or validate date inputs
140
+ without hardcoding what the gem already knows.
141
+
142
+ ```ruby
143
+ Timeprice.metadata
144
+ # => {
145
+ # version: "0.8.0",
146
+ # generated_at: "2026-05-12",
147
+ # countries: [
148
+ # { code: "US", name: "United States", currency: "USD",
149
+ # granularities: ["monthly", "annual"],
150
+ # cpi: { monthly: { min: "1990-01", max: "2026-03" },
151
+ # annual: { min: "1990", max: "2024" } } },
152
+ # ...
153
+ # ],
154
+ # currencies: [{ code: "USD", name: "US dollar" }, ...],
155
+ # fx: { base: "USD", daily_min: "1999-01-04", daily_max: "2026-05-11" }
156
+ # }
157
+ ```
158
+
159
+ The browser calculator linked at the top of this README is the canonical consumer —
160
+ it reads metadata at boot so the UI never disagrees with the dataset.
161
+
91
162
  ## Supported countries, currencies, and data ranges
92
163
 
93
164
  Coverage is derived from the bundled `data/` files. Re-check with `timeprice sources`.
@@ -102,7 +173,7 @@ Coverage is derived from the bundled `data/` files. Re-check with `timeprice sou
102
173
  | Australia | AUD | ABS 6401.0 (quarterly) + World Bank `FP.CPI.TOTL` (annual baseline) | Quarterly + annual | 1948-Q3 → present |
103
174
  | Canada | CAD | Statistics Canada WDS (table 18-10-0004-01, vector `v41690973`) + World Bank annual baseline | Monthly + annual | 1914-01 → present |
104
175
  | 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 |
176
+ | China | CNY | World Bank `FP.CPI.TOTL` (annual primary) + IMF Data Portal CPI dataflow (monthly layer) | Monthly + annual | 1993-01 → present |
106
177
  | Russia | RUB | World Bank `FP.CPI.TOTL` (annual primary) + IMF Data Portal CPI dataflow (monthly layer) | Monthly + annual | 1992-01 → present |
107
178
 
108
179
  **FX (USD base):** ECB reference rates via Frankfurter for **EUR / GBP / JPY / AUD /
@@ -287,7 +358,7 @@ Bundled data lives under `data/` in schema v3 and is self-describing:
287
358
  currencies sourced at annual resolution (today only VND). Used as the
288
359
  fallback tier when no daily rate covers the requested date.
289
360
 
290
- `scripts/check_schema_stability.rb` enforces the shape in CI.
361
+ `tools/data_pipeline/schema_check.rb` enforces the shape in CI.
291
362
 
292
363
  ## Author
293
364
 
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-16",
24
+ "id": "world_bank",
25
+ "label": "World Bank FP.CPI.TOTL (annual, AU baseline)",
26
+ "status": "ok"
27
+ },
28
+ {
29
+ "fetched_at": "2026-05-16",
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
+ }