timeprice 0.5.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +76 -0
  3. data/DATA_LICENSES.md +16 -1
  4. data/README.md +46 -7
  5. data/data/cpi/au.json +419 -0
  6. data/data/cpi/ca.json +1501 -0
  7. data/data/cpi/cn.json +487 -0
  8. data/data/cpi/eu.json +2 -2
  9. data/data/cpi/jp.json +2 -2
  10. data/data/cpi/kr.json +549 -0
  11. data/data/cpi/ru.json +487 -0
  12. data/data/cpi/uk.json +2 -2
  13. data/data/cpi/us.json +2 -2
  14. data/data/cpi/vn.json +27 -27
  15. data/data/fx/usd/1999.json +1043 -263
  16. data/data/fx/usd/2000.json +1275 -259
  17. data/data/fx/usd/2001.json +1278 -258
  18. data/data/fx/usd/2002.json +1283 -259
  19. data/data/fx/usd/2003.json +1283 -259
  20. data/data/fx/usd/2004.json +1303 -263
  21. data/data/fx/usd/2005.json +1293 -261
  22. data/data/fx/usd/2006.json +1283 -259
  23. data/data/fx/usd/2007.json +1283 -259
  24. data/data/fx/usd/2008.json +1288 -260
  25. data/data/fx/usd/2009.json +1288 -260
  26. data/data/fx/usd/2010.json +1298 -262
  27. data/data/fx/usd/2011.json +1293 -261
  28. data/data/fx/usd/2012.json +1288 -260
  29. data/data/fx/usd/2013.json +1283 -259
  30. data/data/fx/usd/2014.json +1283 -259
  31. data/data/fx/usd/2015.json +1288 -260
  32. data/data/fx/usd/2016.json +1293 -261
  33. data/data/fx/usd/2017.json +1283 -259
  34. data/data/fx/usd/2018.json +1283 -259
  35. data/data/fx/usd/2019.json +1283 -259
  36. data/data/fx/usd/2020.json +1293 -261
  37. data/data/fx/usd/2021.json +1298 -262
  38. data/data/fx/usd/2022.json +1293 -261
  39. data/data/fx/usd/2023.json +1283 -259
  40. data/data/fx/usd/2024.json +1288 -260
  41. data/data/fx/usd/2025.json +1283 -259
  42. data/data/fx/usd/2026.json +458 -93
  43. data/data/fx/usd/_annual.json +47 -2
  44. data/data/manifest.json +156 -8
  45. data/lib/timeprice/cli.rb +6 -6
  46. data/lib/timeprice/compare.rb +36 -3
  47. data/lib/timeprice/cpi_lookup.rb +64 -18
  48. data/lib/timeprice/data_loader.rb +8 -13
  49. data/lib/timeprice/date.rb +62 -0
  50. data/lib/timeprice/exchange.rb +49 -23
  51. data/lib/timeprice/granularity.rb +41 -10
  52. data/lib/timeprice/inflation.rb +15 -7
  53. data/lib/timeprice/metadata.rb +121 -0
  54. data/lib/timeprice/metadata_snapshot.rb +23 -0
  55. data/lib/timeprice/point.rb +11 -3
  56. data/lib/timeprice/schema.rb +78 -0
  57. data/lib/timeprice/supported.rb +1 -1
  58. data/lib/timeprice/version.rb +1 -1
  59. data/lib/timeprice.rb +14 -1
  60. metadata +24 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f5a76db32571e7ab2f09f9e22e1d90d420b5bdcf474baff6b523f2c8998c72b
4
- data.tar.gz: 96e212aaa5aac2cfe4defc28364498ef49241de34161cb3e301f4886a19650d0
3
+ metadata.gz: a991e47e7ddcc1b8a88a2be8e8a3850406f1a17bb9f6e0c69164bb25dcdb3fb8
4
+ data.tar.gz: b5d95ebc9b318b9165e32712142906539e230939e8a0e4bdbd2157ad89c247b9
5
5
  SHA512:
6
- metadata.gz: 4148766e8c3dee2243ed933868d23cb2d79959db1581d07de654e1bab87325de98eacb2cd41200e1f765f3d94dde03472dc5d02a37e2e2f059fc8a651ac40666
7
- data.tar.gz: a51e3132f616bc0e468b0f9afdff9ab71a2017abd25eed5ffd45cecc4c385d58f4670ffeeb5cc8bc5f4143f639a42d92f88a2d6e4f81957171d6c3207982d5ee
6
+ metadata.gz: f740a51b83681979a0b1a4b505bae66a4e266df69ba7064df53f50b783e5fd5d3ebfe3b4aea30452c4e216987f0248eb39c4f1e357c5df9ac7b439dc630593b5
7
+ data.tar.gz: 3f5e18ad1ef50e16636f63a7bc96e9bb2fda2ca8b7b7235b2c6534365d82ab0ca53bc24fc5e0d8188a86b5a1d36b5c80522c6f62a37d79d06c4b42f3da71f449
data/CHANGELOG.md CHANGED
@@ -5,6 +5,82 @@ 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
+
54
+ ## [0.6.0] - 2026-05-12
55
+
56
+ ### Added
57
+ - **Five new countries: AU, CA, KR, CN, RU.** CPI + FX coverage:
58
+ - AU (Australia): quarterly CPI from ABS 6401.0, annual baseline from World
59
+ Bank `FP.CPI.TOTL`; AUD daily FX from Frankfurter.
60
+ - CA (Canada): monthly CPI from Statistics Canada WDS (table 18-10-0004-01),
61
+ annual baseline from World Bank; CAD daily FX from Frankfurter.
62
+ - KR (Korea, Rep.): monthly CPI from IMF Data Portal CPI dataflow, annual
63
+ baseline from World Bank; KRW daily FX from Frankfurter. (KOSIS Open API
64
+ is a future upgrade path — see `scripts/sources/kosis.rb`.)
65
+ - CN (China): annual CPI from World Bank, monthly layered from IMF Data
66
+ Portal; CNY daily FX from Frankfurter.
67
+ - RU (Russia): annual CPI from World Bank, monthly layered from IMF; RUB FX
68
+ from IMF IFS `ENDA_XDC_USD_RATE` written as annual averages to
69
+ `_annual.json` (Frankfurter dropped RUB after the ECB suspended reference
70
+ rates in March 2022, so daily RUB is intentionally not bundled).
71
+ - `KRW` added to `Supported::ZERO_DECIMAL_CURRENCIES`.
72
+
73
+ ### Changed
74
+ - **Schema v3 → v4.** Backward-compatible bump:
75
+ - CPI files gain an optional `series.quarterly` block (keyed `YYYY-Qn`)
76
+ alongside `series.monthly` and `series.annual`. Files without quarterly
77
+ data are byte-identical to v3 layout other than the version field.
78
+ - `DataLoader` accepts both v3 and v4 files; new writes are v4.
79
+ - `Granularity` gains `:quarterly`, `:annual_from_quarterly_avg`,
80
+ `:quarterly_from_annual_fallback`, and `:monthly_from_quarterly_fallback`.
81
+ `CpiLookup` resolves "YYYY-Qn" keys and falls back monthly → quarterly →
82
+ annual.
83
+
8
84
  ## [0.5.0] - 2026-05-11
9
85
 
10
86
  ### Changed
data/DATA_LICENSES.md CHANGED
@@ -14,8 +14,15 @@ string.
14
14
  | World Bank | `FP.CPI.TOTL` (JP CPI fallback) | Creative Commons Attribution 4.0 International (CC BY 4.0) | https://datacatalog.worldbank.org/public-licenses#cc-by | Source: World Bank, FP.CPI.TOTL |
15
15
  | World Bank | `FP.CPI.TOTL` (VN CPI, annual fallback) | Creative Commons Attribution 4.0 International (CC BY 4.0) | https://datacatalog.worldbank.org/public-licenses#cc-by | Source: World Bank, FP.CPI.TOTL |
16
16
  | International Monetary Fund | CPI dataflow `VNM.CPI._T.IX.M` via IMF Data Portal (VN CPI, monthly primary) | Free reuse with attribution per IMF terms | https://www.imf.org/external/terms.htm | Source: IMF Data Portal CPI dataflow |
17
- | European Central Bank (via Frankfurter) | Daily reference rates, USD base, EUR/GBP/JPY | ECB reference rates — free reuse; Frankfurter is a non-commercial republisher with no separate license | https://www.ecb.europa.eu/services/disclaimer/html/index.en.html | FX data: European Central Bank reference rates via Frankfurter |
17
+ | European Central Bank (via Frankfurter) | Daily reference rates, USD base, EUR/GBP/JPY/AUD/CAD/KRW/CNY | ECB reference rates — free reuse; Frankfurter is a non-commercial republisher with no separate license | https://www.ecb.europa.eu/services/disclaimer/html/index.en.html | FX data: European Central Bank reference rates via Frankfurter |
18
18
  | World Bank | `PA.NUS.FCRF` (VND annual average FX, broadcast daily) | Creative Commons Attribution 4.0 International (CC BY 4.0) | https://datacatalog.worldbank.org/public-licenses#cc-by | VND FX: World Bank, PA.NUS.FCRF |
19
+ | Australian Bureau of Statistics | `CPI` dataflow, key `3.10001.10.50.Q` (AU CPI, quarterly, all groups, weighted average of eight capital cities) | Creative Commons Attribution 4.0 International (CC BY 4.0) | https://www.abs.gov.au/website-privacy-copyright-and-disclaimer/copyright-and-creative-commons | Source: Australian Bureau of Statistics, 6401.0 Consumer Price Index |
20
+ | Statistics Canada | Table 18-10-0004-01, vector `v41690973` (CA CPI, monthly, all-items, not seasonally adjusted) | Statistics Canada Open License | https://www.statcan.gc.ca/en/reference/licence | Source: Statistics Canada, table 18-10-0004-01 |
21
+ | International Monetary Fund | CPI dataflow `KOR.CPI._T.IX.M` (KR CPI, monthly) | Free reuse with attribution per IMF terms | https://www.imf.org/external/terms.htm | Source: IMF Data Portal CPI dataflow |
22
+ | International Monetary Fund | CPI dataflow `CHN.CPI._T.IX.M` (CN CPI, monthly) | Free reuse with attribution per IMF terms | https://www.imf.org/external/terms.htm | Source: IMF Data Portal CPI dataflow |
23
+ | International Monetary Fund | CPI dataflow `RUS.CPI._T.IX.M` (RU CPI, monthly) | Free reuse with attribution per IMF terms | https://www.imf.org/external/terms.htm | Source: IMF Data Portal CPI dataflow |
24
+ | International Monetary Fund | IFS dataflow `M.RUS.ENDA_XDC_USD_RATE` (RUB/USD, period-average, annual mean written to `_annual.json`) | Free reuse with attribution per IMF terms | https://www.imf.org/external/terms.htm | Source: IMF International Financial Statistics |
25
+ | World Bank | `FP.CPI.TOTL` (AU/CA/KR/CN/RU CPI annual baselines) | Creative Commons Attribution 4.0 International (CC BY 4.0) | https://datacatalog.worldbank.org/public-licenses#cc-by | Source: World Bank, FP.CPI.TOTL |
19
26
 
20
27
  ## Notes
21
28
 
@@ -25,6 +32,14 @@ string.
25
32
  - The Vietnam VND FX series is the **annual average** broadcast to every day in
26
33
  the year — it is intentionally not a daily market rate. Do not use it for
27
34
  intraday or trade-execution purposes.
35
+ - **RUB FX is annual-only** (from IMF IFS period averages). Frankfurter (ECB)
36
+ stopped publishing RUB daily reference rates in March 2022 after the ECB
37
+ suspended the rate, and no other free, no-API-key daily source covers the
38
+ full series. Daily RUB lookups fall back to the annual average and the
39
+ result is tagged so consumers can detect the degradation.
40
+ - **AU CPI is published quarterly only.** Lookups against "YYYY-MM" keys for
41
+ Australia fall back to the quarter that contains the month, and the result
42
+ is tagged `:monthly_from_quarterly_fallback`.
28
43
  - Eurostat HICP is harmonized across the Eurozone and is **not** the same as
29
44
  any national CPI. We use it for the `EU` country code; national CPIs are out
30
45
  of scope for v0.1.
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`.
@@ -99,11 +130,19 @@ Coverage is derived from the bundled `data/` files. Re-check with `timeprice sou
99
130
  | Eurozone (EA) | EUR | Eurostat HICP (`prc_hicp_midx`) | Monthly + annual | 1996-01 → present |
100
131
  | Japan | JPY | World Bank `FP.CPI.TOTL` (fallback) | Annual | 1960 → 2024 |
101
132
  | Vietnam | VND | IMF Data Portal CPI dataflow (monthly primary) + World Bank `FP.CPI.TOTL` (annual fallback) | Monthly + annual | 1995 → present |
102
-
103
- **FX (USD base):** ECB reference rates via Frankfurter for **EUR / GBP / JPY**, daily
104
- 1999 present. **VND** uses the World Bank annual average (`PA.NUS.FCRF`), one value
105
- per year, from 1983 present. VND results are tagged `granularity: :annual` so callers
106
- know they got the annual fallback rather than a daily rate.
133
+ | Australia | AUD | ABS 6401.0 (quarterly) + World Bank `FP.CPI.TOTL` (annual baseline) | Quarterly + annual | 1948-Q3 → present |
134
+ | Canada | CAD | Statistics Canada WDS (table 18-10-0004-01, vector `v41690973`) + World Bank annual baseline | Monthly + annual | 1914-01 → present |
135
+ | Korea (Rep.) | KRW | IMF Data Portal CPI dataflow + World Bank annual baseline | 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 |
137
+ | Russia | RUB | World Bank `FP.CPI.TOTL` (annual primary) + IMF Data Portal CPI dataflow (monthly layer) | Monthly + annual | 1992-01 → present |
138
+
139
+ **FX (USD base):** ECB reference rates via Frankfurter for **EUR / GBP / JPY / AUD /
140
+ CAD / KRW / CNY**, daily 1999 → present. **VND** uses the World Bank annual average
141
+ (`PA.NUS.FCRF`), one value per year, from 1983 → present. **RUB** uses IMF IFS
142
+ period-average rates as annual means (`ENDA_XDC_USD_RATE`) — Frankfurter dropped RUB
143
+ after the ECB suspended its reference rate in March 2022, so daily RUB is intentionally
144
+ not bundled. Annual-fallback results (VND, RUB) are tagged `granularity: :annual` so
145
+ callers know they did not get a daily rate.
107
146
 
108
147
  Triangulated cross-rates (e.g. GBP → JPY) go through USD on the same effective date.
109
148
  Weekend/holiday dates fall back up to 7 days to the nearest prior trading day.
@@ -223,7 +262,7 @@ namespace :inflation do
223
262
  desc "Print 1990→today inflation for the supported countries"
224
263
  task :report do
225
264
  today = Date.today.strftime("%Y-%m")
226
- %w[US UK EU JP VN].each do |c|
265
+ %w[US UK EU JP VN AU CA KR CN RU].each do |c|
227
266
  r = Timeprice.inflation(amount: 100, from: "1990", to: today, country: c)
228
267
  puts "#{c}: 100 in 1990 → #{r.amount.round(2)} in #{today} (#{r.granularity})"
229
268
  end
@@ -279,7 +318,7 @@ Bundled data lives under `data/` in schema v3 and is self-describing:
279
318
  currencies sourced at annual resolution (today only VND). Used as the
280
319
  fallback tier when no daily rate covers the requested date.
281
320
 
282
- `scripts/check_schema_stability.rb` enforces the shape in CI.
321
+ `tools/data_pipeline/schema_check.rb` enforces the shape in CI.
283
322
 
284
323
  ## Author
285
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
+ }