ecos-reader 0.2.2__tar.gz → 0.3.0__tar.gz

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 (114) hide show
  1. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/CHANGELOG.md +25 -0
  2. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/PKG-INFO +13 -19
  3. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/README.md +12 -18
  4. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/exceptions.md +0 -4
  5. ecos_reader-0.3.0/docs/development/partial-coverage-redesign.md +69 -0
  6. ecos_reader-0.3.0/docs/reference/ecos_code_catalog.md +843 -0
  7. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/financial-markets.md +55 -29
  8. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/growth.md +44 -15
  9. ecos_reader-0.3.0/docs/user-guide/migration-v0.3.0.md +107 -0
  10. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/money.md +9 -1
  11. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/mkdocs.yml +7 -0
  12. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/pyproject.toml +1 -1
  13. ecos_reader-0.3.0/scripts/audit_codes.py +561 -0
  14. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/__init__.py +1 -3
  15. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/constants.py +63 -21
  16. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/_frequency.py +3 -4
  17. ecos_reader-0.3.0/src/ecos/indicators/_subcategory.py +148 -0
  18. ecos_reader-0.3.0/src/ecos/indicators/bond.py +141 -0
  19. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/growth.py +90 -49
  20. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/money.py +40 -46
  21. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/prices.py +51 -20
  22. ecos_reader-0.3.0/src/ecos/indicators/stock.py +259 -0
  23. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/types.py +1 -1
  24. ecos_reader-0.3.0/tests/indicators/test_bond.py +178 -0
  25. ecos_reader-0.3.0/tests/indicators/test_growth.py +376 -0
  26. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_money.py +82 -20
  27. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_prices.py +61 -41
  28. ecos_reader-0.3.0/tests/indicators/test_stock.py +197 -0
  29. ecos_reader-0.3.0/tests/indicators/test_subcategory.py +122 -0
  30. ecos_reader-0.3.0/tests/test_codes_live.py +78 -0
  31. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_e2e_indicators.py +87 -34
  32. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/uv.lock +1 -1
  33. ecos_reader-0.2.2/src/ecos/indicators/_deprecations.py +0 -84
  34. ecos_reader-0.2.2/src/ecos/indicators/bond.py +0 -123
  35. ecos_reader-0.2.2/src/ecos/indicators/stock.py +0 -194
  36. ecos_reader-0.2.2/tests/indicators/test_bond.py +0 -68
  37. ecos_reader-0.2.2/tests/indicators/test_deprecations.py +0 -84
  38. ecos_reader-0.2.2/tests/indicators/test_growth.py +0 -422
  39. ecos_reader-0.2.2/tests/indicators/test_stock.py +0 -85
  40. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/CODEOWNERS +0 -0
  41. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/dependabot.yml +0 -0
  42. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/workflows/ci.yml +0 -0
  43. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/workflows/codeql.yml +0 -0
  44. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/workflows/docs.yml +0 -0
  45. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/workflows/nightly-e2e.yml +0 -0
  46. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/workflows/publish.yml +0 -0
  47. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.github/workflows/security.yml +0 -0
  48. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.gitignore +0 -0
  49. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/.pre-commit-config.yaml +0 -0
  50. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/API_SPEC.md +0 -0
  51. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/CONTRIBUTING.md +0 -0
  52. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/IMPLEMENTATION_STATUS.md +0 -0
  53. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/LICENSE +0 -0
  54. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/client.md +0 -0
  55. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/indicators.md +0 -0
  56. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/overview.md +0 -0
  57. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/statistic-item-list.md +0 -0
  58. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/statistic-meta.md +0 -0
  59. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/statistic-search.md +0 -0
  60. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/statistic-table-list.md +0 -0
  61. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/statistic-top-100.md +0 -0
  62. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/api-reference/statistic-word.md +0 -0
  63. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/development/contributing.md +0 -0
  64. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/development/indicator-registry.md +0 -0
  65. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/development/release.md +0 -0
  66. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/examples/basic.md +0 -0
  67. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/examples/dashboard.md +0 -0
  68. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/getting-started/installation.md +0 -0
  69. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/getting-started/quickstart.md +0 -0
  70. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/index.md +0 -0
  71. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/advanced.md +0 -0
  72. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/basic-usage.md +0 -0
  73. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/fiscal.md +0 -0
  74. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/interest-rates.md +0 -0
  75. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/migration-frequency.md +0 -0
  76. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/docs/user-guide/prices.md +0 -0
  77. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/ecos_all_statistics.csv +0 -0
  78. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/ecos_implementation_status.csv +0 -0
  79. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/examples/basic_usage.py +0 -0
  80. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/examples/macro_dashboard.py +0 -0
  81. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/public-api-docs/statistic-item-list.md +0 -0
  82. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/public-api-docs/statistic-meta.md +0 -0
  83. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/public-api-docs/statistic-search.md +0 -0
  84. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/public-api-docs/statistic-table-list.md +0 -0
  85. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/public-api-docs/statistic-top-100.md +0 -0
  86. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/public-api-docs/statistic-word.md +0 -0
  87. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/scripts/gen_indicator_registry_doc.py +0 -0
  88. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/cache.py +0 -0
  89. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/client.py +0 -0
  90. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/config.py +0 -0
  91. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/exceptions.py +0 -0
  92. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/__init__.py +0 -0
  93. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/_dates.py +0 -0
  94. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/_registry.py +0 -0
  95. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/fiscal.py +0 -0
  96. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/indicators/interest_rate.py +0 -0
  97. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/logging.py +0 -0
  98. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/metrics.py +0 -0
  99. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/parser.py +0 -0
  100. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/src/ecos/py.typed +0 -0
  101. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/__init__.py +0 -0
  102. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/conftest.py +0 -0
  103. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/__init__.py +0 -0
  104. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_dates.py +0 -0
  105. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_fiscal.py +0 -0
  106. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_frequency.py +0 -0
  107. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_interest_rate.py +0 -0
  108. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/indicators/test_registry.py +0 -0
  109. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_cache.py +0 -0
  110. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_client.py +0 -0
  111. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_config.py +0 -0
  112. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_e2e.py +0 -0
  113. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_exceptions.py +0 -0
  114. {ecos_reader-0.2.2 → ecos_reader-0.3.0}/tests/test_parser.py +0 -0
@@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.0] - 2026-05-31
9
+
10
+ > Epic #56(Partial-coverage 재설계)의 **BREAKING** 릴리스. 함수명이 전체 시리즈를
11
+ > 시사하지만 단일 ECOS 항목만 반환하던 함수들을 전체 시리즈 long-format +
12
+ > `sub_category` 선택으로 재설계했습니다. 마이그레이션: 사용자 가이드 > v0.3.0 마이그레이션.
13
+
14
+ ### Changed (BREAKING)
15
+ - partial-coverage 함수들의 기본 반환이 **단일 시계열 → 전체 분류 long-format**
16
+ (`date, category_value, value, unit`)으로 변경. 단일 시계열은 `sub_category` 로 선택.
17
+ - `get_gdp_by_industry` / `get_gdp_by_expenditure` / `get_gdp_deflator_by_industry` — PR #85 (#59)
18
+ - `get_stock_index(monthly)`(item_code 1010000 회사수 → 1070000 KOSPI 종가 정정) /
19
+ `get_investor_trading`(`action`·`metric` 인자 추가) — PR #86 (#60)
20
+ - `get_cpi_monthly` — PR #87 (#61)
21
+ - `get_household_lending_detail` — PR #88 (#62)
22
+ - `get_bond_yield`(`measure` 인자 추가, 종류별/시장별 분류) — PR #89 (#63)
23
+ - 공통 헬퍼 `select_subcategory` 도입(규약: 개발 > Partial-coverage 재설계 규약). PR #68 (#58).
24
+
25
+ ### Removed (BREAKING)
26
+ - `EcosPartialCoverageWarning` 클래스 및 내부 `ecos.indicators._deprecations` 모듈 제거.
27
+ 모든 partial-coverage 함수가 재설계되어 더 이상 경고를 내지 않습니다. (#64)
28
+
29
+ ### Added
30
+ - v0.3.0 마이그레이션 가이드(사용자 가이드). (#64)
31
+
8
32
  ## [0.2.2] - 2026-05-30
9
33
 
10
34
  > Epic #3(Extensibility & Long-term Design)의 하위 작업을 정리한 릴리스.
@@ -296,6 +320,7 @@ v0.1.6 라이브 e2e 검증에서 드러난 follow-up(#2 Reliability epic)을
296
320
  - 기본 사용법 (`examples/basic_usage.py`)
297
321
  - 거시경제 대시보드 (`examples/macro_dashboard.py`)
298
322
 
323
+ [0.3.0]: https://github.com/choo121600/ecos-reader/compare/v0.2.2...v0.3.0
299
324
  [0.1.2]: https://github.com/choo121600/ecos-reader/compare/v0.1.1...v0.1.2
300
325
  [0.1.1]: https://github.com/choo121600/ecos-reader/compare/v0.1.0...v0.1.1
301
326
  [0.1.0]: https://github.com/choo121600/ecos-reader/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ecos-reader
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: 한국은행 ECOS Open API Python 클라이언트
5
5
  Project-URL: Homepage, https://github.com/choo121600/ecos-reader
6
6
  Project-URL: Documentation, https://choo121600.github.io/ecos-reader/
@@ -169,7 +169,7 @@ print(df)
169
169
  | 함수 | 설명 | 주기 |
170
170
  |-----|------|-----|
171
171
  | `get_household_credit(category)` | 가계신용 (업권별/용도별) | 분기 |
172
- | `get_household_lending_detail()` | 예금취급기관 가계대출 (용도별) | 월 |
172
+ | `get_household_lending_detail(sub_category)` | 예금취급기관 가계대출 (용도별) | 월 |
173
173
  | `get_borrower_loan(loan_type, category)` | 차주별 가계대출 (신규/잔액) | 분기 |
174
174
 
175
175
  ### 재정·금융시장 지표
@@ -177,23 +177,17 @@ print(df)
177
177
  | 함수 | 설명 | 주기 |
178
178
  |-----|------|-----|
179
179
  | `get_fiscal_balance()` | 통합재정수지 | 월 |
180
- | `get_stock_index(frequency)` | 주가지수 KOSPI (일별/월별) | 일/월 |
181
- | `get_investor_trading()` | 투자자별 주식거래 | 월 |
182
- | `get_bond_yield(bond_type)` | 채권 수익률 (종류별/시장별) | 월 |
183
-
184
- > ⚠️ 다음 함수들은 v0.1.6 기준 단일 ECOS item만 반환하며 호출
185
- > `ecos.EcosPartialCoverageWarning`(`UserWarning` 서브클래스, 기본 필터로도 표시)이
186
- > 발생합니다. v0.3.0에서 시그니처가 변경됩니다: `get_gdp_by_industry`,
187
- > `get_gdp_by_expenditure`, `get_gdp_deflator_by_industry`,
188
- > `get_stock_index(monthly)`, `get_investor_trading`, `get_bond_yield`,
189
- > `get_household_lending_detail`, `get_borrower_loan`, `get_cpi_monthly`.
190
- > 자세한 내용은 이슈 #8.
191
- >
192
- > 경고를 끄려면:
193
- > ```python
194
- > import warnings, ecos
195
- > warnings.simplefilter("ignore", ecos.EcosPartialCoverageWarning)
196
- > ```
180
+ | `get_stock_index(frequency, sub_category)` | 주가지수 KOSPI (일별/월별) | 일/월 |
181
+ | `get_investor_trading(action, metric, sub_category)` | 투자자별 주식거래 | 월 |
182
+ | `get_bond_yield(bond_type, measure, sub_category)` | 채권 거래 (종류별/시장별) | 월 |
183
+
184
+ > ℹ️ v0.3.0(#59~#63)에서 과거 단일 ECOS item만 반환하던 함수들이 모두 전체 시리즈
185
+ > long-format + `sub_category` 선택으로 재설계되었습니다:
186
+ > `get_gdp_by_industry`, `get_gdp_by_expenditure`, `get_gdp_deflator_by_industry`,
187
+ > `get_stock_index(monthly)`, `get_investor_trading`, `get_cpi_monthly`,
188
+ > `get_household_lending_detail`, `get_bond_yield`, `get_borrower_loan`(v0.2.0 #29).
189
+ > 과거의 `EcosPartialCoverageWarning`은 제거되었습니다(#64). 자세한 변경·마이그레이션은
190
+ > [v0.3.0 마이그레이션 가이드](docs/user-guide/migration-v0.3.0.md)를 참고하세요.
197
191
 
198
192
  ## 상세 사용법
199
193
 
@@ -125,7 +125,7 @@ print(df)
125
125
  | 함수 | 설명 | 주기 |
126
126
  |-----|------|-----|
127
127
  | `get_household_credit(category)` | 가계신용 (업권별/용도별) | 분기 |
128
- | `get_household_lending_detail()` | 예금취급기관 가계대출 (용도별) | 월 |
128
+ | `get_household_lending_detail(sub_category)` | 예금취급기관 가계대출 (용도별) | 월 |
129
129
  | `get_borrower_loan(loan_type, category)` | 차주별 가계대출 (신규/잔액) | 분기 |
130
130
 
131
131
  ### 재정·금융시장 지표
@@ -133,23 +133,17 @@ print(df)
133
133
  | 함수 | 설명 | 주기 |
134
134
  |-----|------|-----|
135
135
  | `get_fiscal_balance()` | 통합재정수지 | 월 |
136
- | `get_stock_index(frequency)` | 주가지수 KOSPI (일별/월별) | 일/월 |
137
- | `get_investor_trading()` | 투자자별 주식거래 | 월 |
138
- | `get_bond_yield(bond_type)` | 채권 수익률 (종류별/시장별) | 월 |
139
-
140
- > ⚠️ 다음 함수들은 v0.1.6 기준 단일 ECOS item만 반환하며 호출
141
- > `ecos.EcosPartialCoverageWarning`(`UserWarning` 서브클래스, 기본 필터로도 표시)이
142
- > 발생합니다. v0.3.0에서 시그니처가 변경됩니다: `get_gdp_by_industry`,
143
- > `get_gdp_by_expenditure`, `get_gdp_deflator_by_industry`,
144
- > `get_stock_index(monthly)`, `get_investor_trading`, `get_bond_yield`,
145
- > `get_household_lending_detail`, `get_borrower_loan`, `get_cpi_monthly`.
146
- > 자세한 내용은 이슈 #8.
147
- >
148
- > 경고를 끄려면:
149
- > ```python
150
- > import warnings, ecos
151
- > warnings.simplefilter("ignore", ecos.EcosPartialCoverageWarning)
152
- > ```
136
+ | `get_stock_index(frequency, sub_category)` | 주가지수 KOSPI (일별/월별) | 일/월 |
137
+ | `get_investor_trading(action, metric, sub_category)` | 투자자별 주식거래 | 월 |
138
+ | `get_bond_yield(bond_type, measure, sub_category)` | 채권 거래 (종류별/시장별) | 월 |
139
+
140
+ > ℹ️ v0.3.0(#59~#63)에서 과거 단일 ECOS item만 반환하던 함수들이 모두 전체 시리즈
141
+ > long-format + `sub_category` 선택으로 재설계되었습니다:
142
+ > `get_gdp_by_industry`, `get_gdp_by_expenditure`, `get_gdp_deflator_by_industry`,
143
+ > `get_stock_index(monthly)`, `get_investor_trading`, `get_cpi_monthly`,
144
+ > `get_household_lending_detail`, `get_bond_yield`, `get_borrower_loan`(v0.2.0 #29).
145
+ > 과거의 `EcosPartialCoverageWarning`은 제거되었습니다(#64). 자세한 변경·마이그레이션은
146
+ > [v0.3.0 마이그레이션 가이드](docs/user-guide/migration-v0.3.0.md)를 참고하세요.
153
147
 
154
148
  ## 상세 사용법
155
149
 
@@ -29,7 +29,3 @@ ecos-reader가 발생시키는 예외 및 경고 클래스의 자동 생성 API
29
29
  ::: ecos.EcosValidationError
30
30
  options:
31
31
  heading_level: 2
32
-
33
- ::: ecos.EcosPartialCoverageWarning
34
- options:
35
- heading_level: 2
@@ -0,0 +1,69 @@
1
+ # Partial-coverage 재설계 규약
2
+
3
+ > v0.3.0 마일스톤(epic [#56](https://github.com/choo121600/ecos-reader/issues/56))의 공통 설계 규약입니다. 카테고리별 하위 이슈(#59~#63)는 모두 이 규약을 따릅니다.
4
+
5
+ ## 배경
6
+
7
+ 일부 지표 함수는 함수명이 **전체 시리즈**(예: "산업별 GDP", "투자자별 거래")를 시사하지만, v0.2.x 까지는 실제로 ECOS `item_code1` 단일 항목만 조회해 반환했습니다. 이들은 한동안 `EcosPartialCoverageWarning`([#8](https://github.com/choo121600/ecos-reader/issues/8))과 함께 동작했고, v0.3.0([#56](https://github.com/choo121600/ecos-reader/issues/56))에서 함수 시그니처를 바꿔 전체 시리즈 또는 sub-category 선택을 제공하도록 재설계되었습니다. 재설계 완료 후 경고 클래스는 [#64](https://github.com/choo121600/ecos-reader/issues/64)에서 제거되었습니다.
8
+
9
+ 레퍼런스는 v0.2.0 의 [`get_borrower_loan`](https://github.com/choo121600/ecos-reader/pull/29) 재설계입니다. 이 규약은 그 패턴을 일반화한 것입니다.
10
+
11
+ ## 핵심 사실: ECOS `item_code1` 은 정확 일치 필터
12
+
13
+ ECOS 의 한 통계표(`stat_code`)는 여러 세부 항목을 `item_code1` 으로 묶어 제공합니다. 분류축(연령·지역·업권 등)은 별도 `stat_code` 가 아니라 `item_code1` **prefix** 로 표현되는 경우가 많습니다.
14
+
15
+ ECOS API 의 `item_code1` 파라미터는 *정확 일치* 만 지원하므로 prefix 조회가 불가능합니다. 따라서 재설계 함수는 **`item_code1` 필터 없이 통계표 전량을 받아 client-side 에서 분류축을 필터링**합니다.
16
+
17
+ ## 규약
18
+
19
+ 1. **입력 검증** — 허용되지 않는 인자는 사용 가능 목록과 함께 `ValueError`. 검증은 네트워크 호출 전에 수행합니다.
20
+ 2. **전량 조회** — `client.get_statistic_search(...)` 를 `item_code1` 없이 호출합니다.
21
+ 3. **분류축 필터 + 형식 결정** — `parse_response` 결과를 [`select_subcategory`](#select_subcategory)에 넘깁니다.
22
+ - `sub_category` **미지정**: 분류축 전체를 long-format(`date, category_value, value, unit`)으로 반환하며 `category_value` 컬럼에 세부 항목명을 담습니다.
23
+ - `sub_category` **지정**: 해당 세부 항목 단일 시계열(`date, value, unit`)만 반환합니다. 항목명(`item_name1`)과 `item_code1` 둘 다 허용합니다.
24
+ 4. **친절한 에러** — 존재하지 않는 `sub_category` 는 **사용 가능한 항목 목록과 함께** `ValueError` 를 던집니다.
25
+
26
+ ## `select_subcategory`
27
+
28
+ 공통 선택 로직은 `ecos.indicators._subcategory.select_subcategory` 에 있습니다.
29
+
30
+ ```python
31
+ from ecos.indicators._subcategory import select_subcategory
32
+
33
+ def get_something(sub_category=None, start_date=None, end_date=None):
34
+ # 1) 입력 검증 + 기본 날짜 (생략)
35
+ client = get_client()
36
+ response = client.get_statistic_search(
37
+ stat_code=STAT_SOMETHING,
38
+ period=PERIOD_MONTHLY,
39
+ start_date=start_date,
40
+ end_date=end_date,
41
+ ) # item_code1 미지정 → 전량 수신
42
+ df = parse_response(response)
43
+ return select_subcategory(
44
+ df,
45
+ prefix=PREFIX, # 분류축 item_code1 prefix
46
+ exact=False, # 단일 코드 정확 일치가 필요하면 True
47
+ sub_category=sub_category,
48
+ context="<함수 맥락 설명>", # ValueError 메시지에 포함
49
+ )
50
+ ```
51
+
52
+ | 인자 | 의미 |
53
+ | --- | --- |
54
+ | `prefix` | 분류축 `item_code1` prefix (또는 `exact=True` 일 때 정확코드) |
55
+ | `exact` | `True` → `item_code1 == prefix` 정확 일치 / `False` → `startswith` 매칭 |
56
+ | `sub_category` | 세부 항목명 또는 `item_code1`. 미지정 시 long-format |
57
+ | `context` | `ValueError` 메시지에 포함할 호출 맥락 (예: `"category='연령별'"`) |
58
+
59
+ 분류축 메타데이터(`{분류축: prefix}` 매핑 등)는 함수가 속한 카테고리 모듈 또는 `constants.py` 에 선언합니다. 레퍼런스: `constants.BORROWER_LOAN_CATEGORY_PREFIX`.
60
+
61
+ ### 경계 동작 (하위 이슈가 지켜야 할 계약)
62
+
63
+ - **빈 결과**: 매칭되는 항목이 없으면 빈 DataFrame 을 반환합니다. 컬럼 구성은 보장하지 않으므로 호출자는 `.empty` 로 판별합니다.
64
+ - **항목명 중복**: `item_name1` 은 분류축 내에서 유일하지 않을 수 있습니다. 이름이 겹치는 통계표라면 사용자가 `item_code1` 으로 단일 시계열을 선택할 수 있도록 안내하고, 가능하면 docstring 의 사용 가능 항목 예시에 코드를 함께 노출합니다.
65
+ - **항목명 결측**: `item_name1` 이 결측인 행은 long-format 의 `category_value` 가 결측으로 남습니다. 그대로 두는 것이 기본이며, 결측이 잦은 통계표는 함수 단에서 보정합니다.
66
+
67
+ ## 마이그레이션 영향
68
+
69
+ 이 재설계는 **BREAKING** 변경입니다. 단일 시계열을 반환하던 함수가 기본적으로 long-format 을 반환하게 됩니다. 기존 동작을 원하는 호출자는 `sub_category` 를 명시하거나 `EcosClient.get_statistic_search` 를 직접 사용해야 합니다. 함수별 변경 내역과 마이그레이션 방법은 [v0.3.0 마이그레이션 가이드](../user-guide/migration-v0.3.0.md)를 참고하세요.