ecos-reader 0.2.1__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 (117) hide show
  1. ecos_reader-0.3.0/.github/CODEOWNERS +2 -0
  2. ecos_reader-0.3.0/.github/dependabot.yml +32 -0
  3. ecos_reader-0.3.0/.github/workflows/codeql.yml +38 -0
  4. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/.github/workflows/docs.yml +9 -8
  5. ecos_reader-0.3.0/.github/workflows/nightly-e2e.yml +43 -0
  6. ecos_reader-0.3.0/.github/workflows/security.yml +39 -0
  7. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/.pre-commit-config.yaml +4 -1
  8. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/CHANGELOG.md +56 -0
  9. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/PKG-INFO +23 -27
  10. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/README.md +18 -24
  11. ecos_reader-0.3.0/docs/api-reference/client.md +9 -0
  12. ecos_reader-0.3.0/docs/api-reference/exceptions.md +31 -0
  13. ecos_reader-0.3.0/docs/api-reference/indicators.md +139 -0
  14. ecos_reader-0.3.0/docs/development/indicator-registry.md +28 -0
  15. ecos_reader-0.3.0/docs/development/partial-coverage-redesign.md +69 -0
  16. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/examples/basic.md +4 -4
  17. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/examples/dashboard.md +1 -1
  18. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/getting-started/quickstart.md +4 -4
  19. ecos_reader-0.3.0/docs/reference/ecos_code_catalog.md +843 -0
  20. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/advanced.md +1 -1
  21. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/basic-usage.md +3 -3
  22. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/financial-markets.md +55 -29
  23. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/fiscal.md +1 -1
  24. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/growth.md +70 -41
  25. ecos_reader-0.3.0/docs/user-guide/migration-frequency.md +84 -0
  26. ecos_reader-0.3.0/docs/user-guide/migration-v0.3.0.md +107 -0
  27. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/money.md +10 -2
  28. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/mkdocs.yml +39 -0
  29. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/pyproject.toml +36 -4
  30. ecos_reader-0.3.0/scripts/audit_codes.py +561 -0
  31. ecos_reader-0.3.0/scripts/gen_indicator_registry_doc.py +97 -0
  32. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/__init__.py +13 -3
  33. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/client.py +6 -4
  34. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/constants.py +63 -21
  35. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/__init__.py +12 -37
  36. ecos_reader-0.3.0/src/ecos/indicators/_frequency.py +105 -0
  37. ecos_reader-0.3.0/src/ecos/indicators/_registry.py +237 -0
  38. ecos_reader-0.3.0/src/ecos/indicators/_subcategory.py +148 -0
  39. ecos_reader-0.3.0/src/ecos/indicators/bond.py +141 -0
  40. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/fiscal.py +7 -26
  41. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/growth.py +171 -88
  42. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/interest_rate.py +20 -14
  43. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/money.py +44 -49
  44. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/prices.py +47 -80
  45. ecos_reader-0.3.0/src/ecos/indicators/stock.py +259 -0
  46. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/logging.py +4 -2
  47. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/metrics.py +1 -1
  48. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/types.py +1 -1
  49. ecos_reader-0.3.0/tests/indicators/test_bond.py +178 -0
  50. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/indicators/test_dates.py +1 -1
  51. ecos_reader-0.3.0/tests/indicators/test_fiscal.py +61 -0
  52. ecos_reader-0.3.0/tests/indicators/test_frequency.py +152 -0
  53. ecos_reader-0.3.0/tests/indicators/test_growth.py +376 -0
  54. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/indicators/test_interest_rate.py +149 -3
  55. ecos_reader-0.3.0/tests/indicators/test_money.py +706 -0
  56. ecos_reader-0.3.0/tests/indicators/test_prices.py +258 -0
  57. ecos_reader-0.3.0/tests/indicators/test_registry.py +193 -0
  58. ecos_reader-0.3.0/tests/indicators/test_stock.py +197 -0
  59. ecos_reader-0.3.0/tests/indicators/test_subcategory.py +122 -0
  60. ecos_reader-0.3.0/tests/test_codes_live.py +78 -0
  61. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_e2e_indicators.py +132 -421
  62. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_exceptions.py +2 -1
  63. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/uv.lock +67 -3
  64. ecos_reader-0.2.1/docs/api-reference/client.md +0 -440
  65. ecos_reader-0.2.1/docs/api-reference/exceptions.md +0 -331
  66. ecos_reader-0.2.1/docs/api-reference/indicators.md +0 -432
  67. ecos_reader-0.2.1/src/ecos/indicators/_deprecations.py +0 -84
  68. ecos_reader-0.2.1/src/ecos/indicators/bond.py +0 -122
  69. ecos_reader-0.2.1/src/ecos/indicators/stock.py +0 -191
  70. ecos_reader-0.2.1/tests/indicators/test_deprecations.py +0 -83
  71. ecos_reader-0.2.1/tests/indicators/test_growth.py +0 -117
  72. ecos_reader-0.2.1/tests/indicators/test_money.py +0 -288
  73. ecos_reader-0.2.1/tests/indicators/test_prices.py +0 -98
  74. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/.github/workflows/ci.yml +0 -0
  75. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/.github/workflows/publish.yml +0 -0
  76. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/.gitignore +0 -0
  77. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/API_SPEC.md +0 -0
  78. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/CONTRIBUTING.md +0 -0
  79. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/IMPLEMENTATION_STATUS.md +0 -0
  80. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/LICENSE +0 -0
  81. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/overview.md +0 -0
  82. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/statistic-item-list.md +0 -0
  83. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/statistic-meta.md +0 -0
  84. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/statistic-search.md +0 -0
  85. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/statistic-table-list.md +0 -0
  86. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/statistic-top-100.md +0 -0
  87. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/api-reference/statistic-word.md +0 -0
  88. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/development/contributing.md +0 -0
  89. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/development/release.md +0 -0
  90. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/getting-started/installation.md +0 -0
  91. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/index.md +0 -0
  92. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/interest-rates.md +0 -0
  93. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/docs/user-guide/prices.md +0 -0
  94. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/ecos_all_statistics.csv +0 -0
  95. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/ecos_implementation_status.csv +0 -0
  96. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/examples/basic_usage.py +0 -0
  97. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/examples/macro_dashboard.py +0 -0
  98. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/public-api-docs/statistic-item-list.md +0 -0
  99. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/public-api-docs/statistic-meta.md +0 -0
  100. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/public-api-docs/statistic-search.md +0 -0
  101. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/public-api-docs/statistic-table-list.md +0 -0
  102. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/public-api-docs/statistic-top-100.md +0 -0
  103. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/public-api-docs/statistic-word.md +0 -0
  104. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/cache.py +0 -0
  105. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/config.py +0 -0
  106. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/exceptions.py +0 -0
  107. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/indicators/_dates.py +0 -0
  108. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/parser.py +0 -0
  109. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/src/ecos/py.typed +0 -0
  110. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/__init__.py +0 -0
  111. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/conftest.py +0 -0
  112. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/indicators/__init__.py +0 -0
  113. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_cache.py +0 -0
  114. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_client.py +0 -0
  115. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_config.py +0 -0
  116. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_e2e.py +0 -0
  117. {ecos_reader-0.2.1 → ecos_reader-0.3.0}/tests/test_parser.py +0 -0
@@ -0,0 +1,2 @@
1
+ # 전역 코드 소유자 — 모든 PR에 자동 리뷰 요청
2
+ * @choo121600
@@ -0,0 +1,32 @@
1
+ version: 2
2
+ updates:
3
+ # Python 의존성 (pyproject.toml / uv.lock) — 주간, 묶음 PR
4
+ - package-ecosystem: "pip"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ day: "monday"
9
+ open-pull-requests-limit: 5
10
+ groups:
11
+ python-dependencies:
12
+ patterns:
13
+ - "*"
14
+ update-types:
15
+ - "minor"
16
+ - "patch"
17
+ commit-message:
18
+ prefix: "deps"
19
+
20
+ # GitHub Actions — 주간, 묶음 PR
21
+ - package-ecosystem: "github-actions"
22
+ directory: "/"
23
+ schedule:
24
+ interval: "weekly"
25
+ day: "monday"
26
+ open-pull-requests-limit: 5
27
+ groups:
28
+ github-actions:
29
+ patterns:
30
+ - "*"
31
+ commit-message:
32
+ prefix: "ci"
@@ -0,0 +1,38 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ schedule:
9
+ # 매주 월요일 03:00 UTC — main에 머지된 코드의 정기 재스캔
10
+ - cron: "0 3 * * 1"
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: codeql-${{ github.ref }}
17
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
18
+
19
+ jobs:
20
+ analyze:
21
+ name: Analyze (Python)
22
+ runs-on: ubuntu-latest
23
+ permissions:
24
+ security-events: write
25
+ contents: read
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+
29
+ - name: Initialize CodeQL
30
+ uses: github/codeql-action/init@v3
31
+ with:
32
+ languages: python
33
+ queries: security-extended
34
+
35
+ - name: Perform CodeQL Analysis
36
+ uses: github/codeql-action/analyze@v3
37
+ with:
38
+ category: "/language:python"
@@ -17,17 +17,18 @@ jobs:
17
17
  steps:
18
18
  - uses: actions/checkout@v4
19
19
 
20
- - name: Set up Python
21
- uses: actions/setup-python@v5
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v3
22
22
  with:
23
- python-version: '3.10'
23
+ enable-cache: true
24
24
 
25
- - name: Install dependencies
26
- run: |
27
- pip install mkdocs mkdocs-material
25
+ - name: Set up Python
26
+ run: uv python install 3.12
28
27
 
29
- - name: Build documentation
30
- run: mkdocs build
28
+ # docs extras(mkdocstrings 포함)로 빌드. --strict로 깨진 링크/누락을
29
+ # 빌드 실패로 검출 (#18). PR에서도 동일 검증이 실행된다.
30
+ - name: Build documentation (strict)
31
+ run: uv run --extra docs --python 3.12 mkdocs build --strict
31
32
 
32
33
  - name: Deploy to GitHub Pages
33
34
  if: github.event_name == 'push' && github.ref == 'refs/heads/main'
@@ -0,0 +1,43 @@
1
+ name: Nightly E2E
2
+
3
+ # 실 ECOS Open API를 호출하는 e2e 테스트를 매일 1회 실행해 외부 API 회귀를 감시한다.
4
+ # PR CI(ci.yml)는 `pytest -m "not e2e"`로 빠른 피드백만 담당하고, 실 API 검증은
5
+ # 여기서 분리 실행한다. (ECOS rate limit: 3분간 300회 / 초과 시 30분 차단)
6
+
7
+ on:
8
+ schedule:
9
+ # 매일 18:00 UTC (= 03:00 KST)
10
+ - cron: "0 18 * * *"
11
+ workflow_dispatch: {}
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: ${{ github.workflow }}
18
+ cancel-in-progress: false
19
+
20
+ jobs:
21
+ e2e:
22
+ name: E2E (real ECOS API)
23
+ runs-on: ubuntu-latest
24
+ # fork에는 secret이 없어 의미가 없으므로 upstream 레포에서만 실행
25
+ if: github.repository == 'choo121600/ecos-reader'
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+
29
+ - name: Install uv
30
+ uses: astral-sh/setup-uv@v3
31
+ with:
32
+ enable-cache: true
33
+
34
+ - name: Set up Python
35
+ run: uv python install 3.12
36
+
37
+ - name: Sync dev dependencies
38
+ run: uv sync --extra dev --python 3.12
39
+
40
+ - name: Run e2e tests
41
+ env:
42
+ ECOS_API_KEY: ${{ secrets.ECOS_API_KEY }}
43
+ run: uv run pytest -m "e2e"
@@ -0,0 +1,39 @@
1
+ name: Security
2
+
3
+ on:
4
+ # pip-audit는 신규 공시 취약점을 주기적으로 점검하는 용도(이슈 #19).
5
+ # PR 게이트는 CodeQL이 담당하므로 여기서는 주간 스케줄 + 수동 실행만 둔다.
6
+ schedule:
7
+ # 매주 월요일 04:00 UTC
8
+ - cron: "0 4 * * 1"
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: security-${{ github.ref }}
16
+ cancel-in-progress: false
17
+
18
+ jobs:
19
+ pip-audit:
20
+ name: pip-audit
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+
25
+ - name: Install uv
26
+ uses: astral-sh/setup-uv@v3
27
+ with:
28
+ enable-cache: true
29
+
30
+ - name: Set up Python
31
+ run: uv python install 3.12
32
+
33
+ # 모든 extras를 포함해 .venv를 구성한 뒤, 설치된 환경을 직접 감사한다.
34
+ # requirements 파일 감사는 pip-audit가 격리 venv를 빌드하므로 환경 감사가 더 견고.
35
+ - name: Sync dependencies
36
+ run: uv sync --all-extras --python 3.12
37
+
38
+ - name: Run pip-audit
39
+ run: uv run --with pip-audit pip-audit
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.5.0
3
+ rev: v5.0.0
4
4
  hooks:
5
5
  - id: trailing-whitespace
6
6
  - id: end-of-file-fixer
@@ -24,4 +24,7 @@ repos:
24
24
  rev: v1.13.0
25
25
  hooks:
26
26
  - id: mypy
27
+ # mypy strict(#17)는 src 패키지에만 적용 — CI(ci.yml)의 `mypy src/ecos`와
28
+ # 동일 범위. 테스트는 무타입 함수가 정상이므로 strict 대상에서 제외.
29
+ files: ^src/ecos/
27
30
  additional_dependencies: [types-requests]
@@ -5,6 +5,61 @@ 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
+
32
+ ## [0.2.2] - 2026-05-30
33
+
34
+ > Epic #3(Extensibility & Long-term Design)의 하위 작업을 정리한 릴리스.
35
+ > 모든 변경이 하위호환이라, `0.3.0`(시그니처 breaking 재설계용 예약)을 침범하지
36
+ > 않도록 patch(0.2.2) 로 릴리스합니다.
37
+
38
+ ### Added
39
+ - `frequency` 어휘를 풀네임으로 통일: `daily` / `monthly` / `quarterly` / `annual`.
40
+ 카테고리마다 달랐던 표기(`growth` 의 `Q`/`A`, `interest_rate` 의 `D`/`M`,
41
+ `stock` 의 `daily`/`monthly`)를 정식 어휘로 일원화. PR #51 (#20).
42
+ - `EcosDeprecationWarning` 공개 export (`from ecos import EcosDeprecationWarning`).
43
+ 레거시 입력값 사용 시 발생하며, 기본 경고 필터에서도 보이도록 `UserWarning` 기반.
44
+ - `mkdocstrings` 도입으로 indicator/클라이언트/예외 API 문서를 docstring 기반
45
+ 자동 생성. PR #53 (#18).
46
+
47
+ ### Deprecated
48
+ - 레거시 단일 문자 `frequency`(`"D"`/`"M"`/`"Q"`/`"A"`). 당분간 동작하되
49
+ `EcosDeprecationWarning` 을 발생시키며 **v0.4.0** 에서 제거 예정. 정식 어휘로
50
+ 마이그레이션하세요(문서: 사용자 가이드 > frequency 마이그레이션). PR #51 (#20).
51
+
52
+ ### Changed
53
+ - `mypy strict` 모드 적용 — `py.typed` 광고와 실제 타입 안전성을 일치. CI 의
54
+ `mypy src/ecos` 가 strict 를 강제. PR #52 (#17).
55
+ - `mkdocs build --strict` 적용 — 깨진 링크/누락 페이지를 빌드 실패로 검출,
56
+ PR 에서도 docs 빌드 검증. PR #53 (#18).
57
+
58
+ ### Internal
59
+ - 보안/유지보수 자동화: `dependabot`(pip·github-actions), `CodeQL`(Python),
60
+ `pip-audit`(주간), `CODEOWNERS` 추가. `ruff` 규칙에 `S`(bandit)/`RUF`/`PT`/
61
+ `TC`/`N` 추가. PR #50 (#19).
62
+
8
63
  ## [0.2.1] - 2026-05-29
9
64
 
10
65
  > 0.3.0 은 시그니처 breaking 재설계(epic #3)를 위해 예약돼 있어, 본 하위호환
@@ -265,6 +320,7 @@ v0.1.6 라이브 e2e 검증에서 드러난 follow-up(#2 Reliability epic)을
265
320
  - 기본 사용법 (`examples/basic_usage.py`)
266
321
  - 거시경제 대시보드 (`examples/macro_dashboard.py`)
267
322
 
323
+ [0.3.0]: https://github.com/choo121600/ecos-reader/compare/v0.2.2...v0.3.0
268
324
  [0.1.2]: https://github.com/choo121600/ecos-reader/compare/v0.1.1...v0.1.2
269
325
  [0.1.1]: https://github.com/choo121600/ecos-reader/compare/v0.1.0...v0.1.1
270
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.1
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/
@@ -36,8 +36,10 @@ Requires-Dist: responses>=0.23.0; extra == 'dev'
36
36
  Requires-Dist: ruff>=0.1.0; extra == 'dev'
37
37
  Requires-Dist: types-requests>=2.28.0; extra == 'dev'
38
38
  Provides-Extra: docs
39
- Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
40
- Requires-Dist: mkdocs>=1.5.0; extra == 'docs'
39
+ Requires-Dist: mkdocs-material<10.0.0,>=9.5.0; extra == 'docs'
40
+ Requires-Dist: mkdocs<2.0.0,>=1.5.0; extra == 'docs'
41
+ Requires-Dist: mkdocstrings[python]>=0.24.0; extra == 'docs'
42
+ Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
41
43
  Description-Content-Type: text/markdown
42
44
 
43
45
  # ecos-reader
@@ -117,7 +119,7 @@ df = ecos.get_treasury_yield(maturity="10Y")
117
119
  print(df)
118
120
 
119
121
  # GDP 조회
120
- df = ecos.get_gdp(frequency="Q", basis="real")
122
+ df = ecos.get_gdp(frequency="quarterly", basis="real")
121
123
  print(df)
122
124
  ```
123
125
 
@@ -167,7 +169,7 @@ print(df)
167
169
  | 함수 | 설명 | 주기 |
168
170
  |-----|------|-----|
169
171
  | `get_household_credit(category)` | 가계신용 (업권별/용도별) | 분기 |
170
- | `get_household_lending_detail()` | 예금취급기관 가계대출 (용도별) | 월 |
172
+ | `get_household_lending_detail(sub_category)` | 예금취급기관 가계대출 (용도별) | 월 |
171
173
  | `get_borrower_loan(loan_type, category)` | 차주별 가계대출 (신규/잔액) | 분기 |
172
174
 
173
175
  ### 재정·금융시장 지표
@@ -175,23 +177,17 @@ print(df)
175
177
  | 함수 | 설명 | 주기 |
176
178
  |-----|------|-----|
177
179
  | `get_fiscal_balance()` | 통합재정수지 | 월 |
178
- | `get_stock_index(frequency)` | 주가지수 KOSPI (일별/월별) | 일/월 |
179
- | `get_investor_trading()` | 투자자별 주식거래 | 월 |
180
- | `get_bond_yield(bond_type)` | 채권 수익률 (종류별/시장별) | 월 |
181
-
182
- > ⚠️ 다음 함수들은 v0.1.6 기준 단일 ECOS item만 반환하며 호출
183
- > `ecos.EcosPartialCoverageWarning`(`UserWarning` 서브클래스, 기본 필터로도 표시)이
184
- > 발생합니다. v0.3.0에서 시그니처가 변경됩니다: `get_gdp_by_industry`,
185
- > `get_gdp_by_expenditure`, `get_gdp_deflator_by_industry`,
186
- > `get_stock_index(monthly)`, `get_investor_trading`, `get_bond_yield`,
187
- > `get_household_lending_detail`, `get_borrower_loan`, `get_cpi_monthly`.
188
- > 자세한 내용은 이슈 #8.
189
- >
190
- > 경고를 끄려면:
191
- > ```python
192
- > import warnings, ecos
193
- > warnings.simplefilter("ignore", ecos.EcosPartialCoverageWarning)
194
- > ```
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)를 참고하세요.
195
191
 
196
192
  ## 상세 사용법
197
193
 
@@ -205,10 +201,10 @@ df = ecos.get_base_rate(start_date="202001", end_date="202312")
205
201
  df = ecos.get_treasury_yield(maturity="3Y", start_date="20240101", end_date="20241231")
206
202
 
207
203
  # 분기 데이터 (YYYYQN 형식)
208
- df = ecos.get_gdp(frequency="Q", start_date="2020Q1", end_date="2024Q4")
204
+ df = ecos.get_gdp(frequency="quarterly", start_date="2020Q1", end_date="2024Q4")
209
205
 
210
206
  # 연간 데이터 (YYYY 형식)
211
- df = ecos.get_gdp(frequency="A", start_date="2015", end_date="2024")
207
+ df = ecos.get_gdp(frequency="annual", start_date="2015", end_date="2024")
212
208
  ```
213
209
 
214
210
  ### 고급 사용 예제
@@ -238,14 +234,14 @@ plt.show()
238
234
  import ecos
239
235
 
240
236
  # 실질 GDP 및 성장률 조회
241
- gdp = ecos.get_gdp(frequency="Q", basis="real", start_date="2020Q1", end_date="2024Q4")
242
- growth = ecos.get_gdp_growth_rate(frequency="Q", start_date="2020Q1", end_date="2024Q4")
237
+ gdp = ecos.get_gdp(frequency="quarterly", basis="real", start_date="2020Q1", end_date="2024Q4")
238
+ growth = ecos.get_gdp_growth_rate(frequency="quarterly", start_date="2020Q1", end_date="2024Q4")
243
239
 
244
240
  # 산업별 기여도 분석
245
241
  industry_gdp = ecos.get_gdp_by_industry(
246
242
  basis="real",
247
243
  seasonal_adj=True,
248
- frequency="Q",
244
+ frequency="quarterly",
249
245
  start_date="2023Q1",
250
246
  end_date="2023Q4"
251
247
  )
@@ -75,7 +75,7 @@ df = ecos.get_treasury_yield(maturity="10Y")
75
75
  print(df)
76
76
 
77
77
  # GDP 조회
78
- df = ecos.get_gdp(frequency="Q", basis="real")
78
+ df = ecos.get_gdp(frequency="quarterly", basis="real")
79
79
  print(df)
80
80
  ```
81
81
 
@@ -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
 
@@ -163,10 +157,10 @@ df = ecos.get_base_rate(start_date="202001", end_date="202312")
163
157
  df = ecos.get_treasury_yield(maturity="3Y", start_date="20240101", end_date="20241231")
164
158
 
165
159
  # 분기 데이터 (YYYYQN 형식)
166
- df = ecos.get_gdp(frequency="Q", start_date="2020Q1", end_date="2024Q4")
160
+ df = ecos.get_gdp(frequency="quarterly", start_date="2020Q1", end_date="2024Q4")
167
161
 
168
162
  # 연간 데이터 (YYYY 형식)
169
- df = ecos.get_gdp(frequency="A", start_date="2015", end_date="2024")
163
+ df = ecos.get_gdp(frequency="annual", start_date="2015", end_date="2024")
170
164
  ```
171
165
 
172
166
  ### 고급 사용 예제
@@ -196,14 +190,14 @@ plt.show()
196
190
  import ecos
197
191
 
198
192
  # 실질 GDP 및 성장률 조회
199
- gdp = ecos.get_gdp(frequency="Q", basis="real", start_date="2020Q1", end_date="2024Q4")
200
- growth = ecos.get_gdp_growth_rate(frequency="Q", start_date="2020Q1", end_date="2024Q4")
193
+ gdp = ecos.get_gdp(frequency="quarterly", basis="real", start_date="2020Q1", end_date="2024Q4")
194
+ growth = ecos.get_gdp_growth_rate(frequency="quarterly", start_date="2020Q1", end_date="2024Q4")
201
195
 
202
196
  # 산업별 기여도 분석
203
197
  industry_gdp = ecos.get_gdp_by_industry(
204
198
  basis="real",
205
199
  seasonal_adj=True,
206
- frequency="Q",
200
+ frequency="quarterly",
207
201
  start_date="2023Q1",
208
202
  end_date="2023Q4"
209
203
  )
@@ -0,0 +1,9 @@
1
+ # EcosClient
2
+
3
+ 한국은행 ECOS Open API와 직접 통신하는 저수준 클라이언트 클래스입니다.
4
+
5
+ ::: ecos.EcosClient
6
+ options:
7
+ heading_level: 2
8
+ show_root_heading: true
9
+ members_order: source
@@ -0,0 +1,31 @@
1
+ # 예외 처리
2
+
3
+ ecos-reader가 발생시키는 예외 및 경고 클래스의 자동 생성 API 레퍼런스입니다.
4
+
5
+ ::: ecos.EcosError
6
+ options:
7
+ heading_level: 2
8
+
9
+ ::: ecos.EcosAPIError
10
+ options:
11
+ heading_level: 2
12
+
13
+ ::: ecos.EcosConfigError
14
+ options:
15
+ heading_level: 2
16
+
17
+ ::: ecos.EcosNetworkError
18
+ options:
19
+ heading_level: 2
20
+
21
+ ::: ecos.EcosRateLimitError
22
+ options:
23
+ heading_level: 2
24
+
25
+ ::: ecos.EcosServerError
26
+ options:
27
+ heading_level: 2
28
+
29
+ ::: ecos.EcosValidationError
30
+ options:
31
+ heading_level: 2
@@ -0,0 +1,139 @@
1
+ # 지표 함수
2
+
3
+ 모든 지표 조회 함수의 자동 생성 API 레퍼런스입니다.
4
+
5
+ ## 금리 지표
6
+
7
+ ::: ecos.get_base_rate
8
+ options:
9
+ heading_level: 3
10
+
11
+ ::: ecos.get_treasury_yield
12
+ options:
13
+ heading_level: 3
14
+
15
+ ::: ecos.get_yield_spread
16
+ options:
17
+ heading_level: 3
18
+
19
+ ::: ecos.get_bank_deposit_rate
20
+ options:
21
+ heading_level: 3
22
+
23
+ ::: ecos.get_bank_lending_rate
24
+ options:
25
+ heading_level: 3
26
+
27
+ ## 물가 지표
28
+
29
+ ::: ecos.get_cpi
30
+ options:
31
+ heading_level: 3
32
+
33
+ ::: ecos.get_core_cpi
34
+ options:
35
+ heading_level: 3
36
+
37
+ ::: ecos.get_cpi_monthly
38
+ options:
39
+ heading_level: 3
40
+
41
+ ::: ecos.get_cpi_by_category
42
+ options:
43
+ heading_level: 3
44
+
45
+ ::: ecos.get_ppi
46
+ options:
47
+ heading_level: 3
48
+
49
+ ## 성장 지표
50
+
51
+ ::: ecos.get_gdp
52
+ options:
53
+ heading_level: 3
54
+
55
+ ::: ecos.get_gdp_deflator
56
+ options:
57
+ heading_level: 3
58
+
59
+ ::: ecos.get_gdp_growth_rate
60
+ options:
61
+ heading_level: 3
62
+
63
+ ::: ecos.get_gdp_by_industry
64
+ options:
65
+ heading_level: 3
66
+
67
+ ::: ecos.get_gdp_by_expenditure
68
+ options:
69
+ heading_level: 3
70
+
71
+ ::: ecos.get_gdp_deflator_by_industry
72
+ options:
73
+ heading_level: 3
74
+
75
+ ## 통화 지표
76
+
77
+ ::: ecos.get_money_supply
78
+ options:
79
+ heading_level: 3
80
+
81
+ ::: ecos.get_m1_variants
82
+ options:
83
+ heading_level: 3
84
+
85
+ ::: ecos.get_m2_variants
86
+ options:
87
+ heading_level: 3
88
+
89
+ ::: ecos.get_m2_by_holder
90
+ options:
91
+ heading_level: 3
92
+
93
+ ::: ecos.get_bank_lending
94
+ options:
95
+ heading_level: 3
96
+
97
+ ::: ecos.get_household_credit
98
+ options:
99
+ heading_level: 3
100
+
101
+ ::: ecos.get_household_lending_detail
102
+ options:
103
+ heading_level: 3
104
+
105
+ ::: ecos.get_borrower_loan
106
+ options:
107
+ heading_level: 3
108
+
109
+ ## 채권 지표
110
+
111
+ ::: ecos.get_bond_yield
112
+ options:
113
+ heading_level: 3
114
+
115
+ ## 재정 지표
116
+
117
+ ::: ecos.get_fiscal_balance
118
+ options:
119
+ heading_level: 3
120
+
121
+ ## 주식시장 지표
122
+
123
+ ::: ecos.get_stock_index
124
+ options:
125
+ heading_level: 3
126
+
127
+ ::: ecos.get_investor_trading
128
+ options:
129
+ heading_level: 3
130
+
131
+ ## 지표 레지스트리
132
+
133
+ ::: ecos.list_indicators
134
+ options:
135
+ heading_level: 3
136
+
137
+ ::: ecos.indicators.get_indicator
138
+ options:
139
+ heading_level: 3
@@ -0,0 +1,28 @@
1
+ # 선언적 지표 레지스트리 (Indicator Registry)
2
+
3
+ > 이 파일은 `scripts/gen_indicator_registry_doc.py` 가 `ecos.indicators.INDICATORS` 레지스트리에서 자동 생성합니다. 직접 편집하지 마세요.
4
+ >
5
+ > 전체 ECOS 통계 구현 현황은 `IMPLEMENTATION_STATUS.md` 를 참고하세요. 이 문서는 레지스트리에 등록된 단순 지표만 다룹니다.
6
+
7
+ 등록된 선언적 지표: **6건**
8
+
9
+ ## 금리
10
+
11
+ | name | 통계표코드 | 항목코드 | 주기 | 단위 | 설명 |
12
+ | --- | --- | --- | --- | --- | --- |
13
+ | `base_rate` | 722Y001 | 0101000 | 월별 | % | 한국은행 기준금리 |
14
+
15
+ ## 물가
16
+
17
+ | name | 통계표코드 | 항목코드 | 주기 | 단위 | 설명 |
18
+ | --- | --- | --- | --- | --- | --- |
19
+ | `core_cpi` | 901Y010 | 00 | 월별 | % | 근원 소비자물가지수(Core CPI) |
20
+ | `cpi` | 901Y009 | 0 | 월별 | % | 소비자물가지수(CPI) 전년동월비 |
21
+ | `cpi_monthly` | 901Y009 | 0 | 월별 | - | 소비자물가지수 월별 원지수(총지수) |
22
+ | `ppi` | 404Y014 | *AA | 월별 | % | 생산자물가지수(PPI) |
23
+
24
+ ## 재정
25
+
26
+ | name | 통계표코드 | 항목코드 | 주기 | 단위 | 설명 |
27
+ | --- | --- | --- | --- | --- | --- |
28
+ | `fiscal_balance` | 901Y013 | A | 월별 | 조원 | 통합재정수지 |