kuznets 1.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 (147) hide show
  1. kuznets-1.0/.codecov.yml +11 -0
  2. kuznets-1.0/.github/release.yml +26 -0
  3. kuznets-1.0/.github/workflows/ci.yml +58 -0
  4. kuznets-1.0/.github/workflows/refresh-fixtures.yml +64 -0
  5. kuznets-1.0/.github/workflows/release.yml +36 -0
  6. kuznets-1.0/.gitignore +21 -0
  7. kuznets-1.0/.pre-commit-config.yaml +36 -0
  8. kuznets-1.0/LICENSE.md +49 -0
  9. kuznets-1.0/PKG-INFO +177 -0
  10. kuznets-1.0/README.md +119 -0
  11. kuznets-1.0/codecov.yml +12 -0
  12. kuznets-1.0/docs/Makefile +20 -0
  13. kuznets-1.0/docs/contributors.py +29 -0
  14. kuznets-1.0/docs/make.bat +36 -0
  15. kuznets-1.0/docs/requirements.txt +1 -0
  16. kuznets-1.0/docs/source/cache.rst +54 -0
  17. kuznets-1.0/docs/source/conf.py +206 -0
  18. kuznets-1.0/docs/source/configuration.rst +70 -0
  19. kuznets-1.0/docs/source/index.rst +87 -0
  20. kuznets-1.0/docs/source/readers/alphavantage.rst +15 -0
  21. kuznets-1.0/docs/source/readers/bank-of-canada.rst +8 -0
  22. kuznets-1.0/docs/source/readers/econdb.rst +8 -0
  23. kuznets-1.0/docs/source/readers/eurostat.rst +8 -0
  24. kuznets-1.0/docs/source/readers/famafrench.rst +10 -0
  25. kuznets-1.0/docs/source/readers/fred.rst +8 -0
  26. kuznets-1.0/docs/source/readers/index.rst +22 -0
  27. kuznets-1.0/docs/source/readers/moex.rst +8 -0
  28. kuznets-1.0/docs/source/readers/nasdaq-trader.rst +6 -0
  29. kuznets-1.0/docs/source/readers/naver.rst +8 -0
  30. kuznets-1.0/docs/source/readers/oecd.rst +8 -0
  31. kuznets-1.0/docs/source/readers/quandl.rst +8 -0
  32. kuznets-1.0/docs/source/readers/stooq.rst +8 -0
  33. kuznets-1.0/docs/source/readers/tiingo.rst +18 -0
  34. kuznets-1.0/docs/source/readers/tsp.rst +8 -0
  35. kuznets-1.0/docs/source/readers/world-bank.rst +16 -0
  36. kuznets-1.0/docs/source/readers/yahoo.rst +46 -0
  37. kuznets-1.0/docs/source/remote_data.rst +758 -0
  38. kuznets-1.0/docs/source/see-also.rst +40 -0
  39. kuznets-1.0/kuznets/__init__.py +74 -0
  40. kuznets-1.0/kuznets/_output.py +337 -0
  41. kuznets-1.0/kuznets/_testing.py +29 -0
  42. kuznets-1.0/kuznets/_utils.py +128 -0
  43. kuznets-1.0/kuznets/av/__init__.py +111 -0
  44. kuznets-1.0/kuznets/av/forex.py +124 -0
  45. kuznets-1.0/kuznets/av/time_series.py +154 -0
  46. kuznets-1.0/kuznets/bankofcanada.py +49 -0
  47. kuznets-1.0/kuznets/base.py +674 -0
  48. kuznets-1.0/kuznets/compat/__init__.py +33 -0
  49. kuznets-1.0/kuznets/config.py +211 -0
  50. kuznets-1.0/kuznets/conftest.py +60 -0
  51. kuznets-1.0/kuznets/data.py +522 -0
  52. kuznets-1.0/kuznets/econdb.py +151 -0
  53. kuznets-1.0/kuznets/eurostat.py +47 -0
  54. kuznets-1.0/kuznets/famafrench.py +183 -0
  55. kuznets-1.0/kuznets/fred.py +100 -0
  56. kuznets-1.0/kuznets/io/__init__.py +3 -0
  57. kuznets-1.0/kuznets/io/jsdmx.py +49 -0
  58. kuznets-1.0/kuznets/io/jstat.py +54 -0
  59. kuznets-1.0/kuznets/io/sdmx.py +237 -0
  60. kuznets-1.0/kuznets/io/util.py +192 -0
  61. kuznets-1.0/kuznets/moex.py +258 -0
  62. kuznets-1.0/kuznets/nasdaq_trader.py +137 -0
  63. kuznets-1.0/kuznets/naver.py +161 -0
  64. kuznets-1.0/kuznets/oecd.py +57 -0
  65. kuznets-1.0/kuznets/quandl.py +184 -0
  66. kuznets-1.0/kuznets/stooq.py +52 -0
  67. kuznets-1.0/kuznets/tiingo.py +387 -0
  68. kuznets-1.0/kuznets/tsp.py +116 -0
  69. kuznets-1.0/kuznets/wb.py +931 -0
  70. kuznets-1.0/kuznets/yahoo/__init__.py +0 -0
  71. kuznets-1.0/kuznets/yahoo/_auth.py +28 -0
  72. kuznets-1.0/kuznets/yahoo/actions.py +93 -0
  73. kuznets-1.0/kuznets/yahoo/daily.py +235 -0
  74. kuznets-1.0/kuznets/yahoo/fundamentals.py +331 -0
  75. kuznets-1.0/kuznets/yahoo/fx.py +114 -0
  76. kuznets-1.0/kuznets/yahoo/headers.py +14 -0
  77. kuznets-1.0/kuznets/yahoo/options.py +804 -0
  78. kuznets-1.0/kuznets/yahoo/quotes.py +71 -0
  79. kuznets-1.0/pixi.lock +14636 -0
  80. kuznets-1.0/pyproject.toml +187 -0
  81. kuznets-1.0/tests/__init__.py +0 -0
  82. kuznets-1.0/tests/_backends.py +22 -0
  83. kuznets-1.0/tests/_mock.py +242 -0
  84. kuznets-1.0/tests/av/__init__.py +0 -0
  85. kuznets-1.0/tests/av/test_av_forex.py +84 -0
  86. kuznets-1.0/tests/av/test_av_time_series.py +253 -0
  87. kuznets-1.0/tests/conftest.py +79 -0
  88. kuznets-1.0/tests/data/bankofcanada/fx_usd_cad.csv +29 -0
  89. kuznets-1.0/tests/data/eurostat/ert_h_eur_a.json +1 -0
  90. kuznets-1.0/tests/data/famafrench/F-F_Research_Data_Factors_CSV.zip +0 -0
  91. kuznets-1.0/tests/data/famafrench/F-F_Research_Data_Factors_daily_CSV.zip +0 -0
  92. kuznets-1.0/tests/data/famafrench/ME_Breakpoints_CSV.zip +0 -0
  93. kuznets-1.0/tests/data/famafrench/Prior_2-12_Breakpoints_CSV.zip +0 -0
  94. kuznets-1.0/tests/data/famafrench/data_library.html +6 -0
  95. kuznets-1.0/tests/data/fred/dfii5.csv +7 -0
  96. kuznets-1.0/tests/data/fred/gdp.csv +14 -0
  97. kuznets-1.0/tests/data/fred/gdp_api.json +9 -0
  98. kuznets-1.0/tests/data/moex/sber_history.csv +5 -0
  99. kuznets-1.0/tests/data/moex/sber_meta.csv +86 -0
  100. kuznets-1.0/tests/data/nasdaq/nasdaqtraded.txt +6 -0
  101. kuznets-1.0/tests/data/naver/005930.xml +9 -0
  102. kuznets-1.0/tests/data/oecd/tud.json +1 -0
  103. kuznets-1.0/tests/data/stooq/spy.csv +10 -0
  104. kuznets-1.0/tests/data/wb/bad_indicator.json +7 -0
  105. kuznets-1.0/tests/data/wb/countries.json +1 -0
  106. kuznets-1.0/tests/data/wb/country_jp_gdp.json +1 -0
  107. kuznets-1.0/tests/data/wb/indicators.json +41 -0
  108. kuznets-1.0/tests/data/yahoo/chart_aapl_2020.json +1 -0
  109. kuznets-1.0/tests/data/yahoo/chart_empty.json +1 -0
  110. kuznets-1.0/tests/data/yahoo/fundamentals_aapl.json +1 -0
  111. kuznets-1.0/tests/data/yahoo/options_aapl.json +1 -0
  112. kuznets-1.0/tests/data/yahoo/quote_aapl_goog.json +1 -0
  113. kuznets-1.0/tests/io/__init__.py +0 -0
  114. kuznets-1.0/tests/io/data/jsdmx/__init__.py +0 -0
  115. kuznets-1.0/tests/io/data/jsdmx/oecd_tud.json +1 -0
  116. kuznets-1.0/tests/io/data/sdmx/DSD_cdh_e_fos.xml +345 -0
  117. kuznets-1.0/tests/io/data/sdmx/__init__.py +0 -0
  118. kuznets-1.0/tests/io/data/sdmx/cdh_e_fos.xml +1 -0
  119. kuznets-1.0/tests/io/test_jsdmx.py +24 -0
  120. kuznets-1.0/tests/io/test_jstat.py +61 -0
  121. kuznets-1.0/tests/io/test_sdmx.py +38 -0
  122. kuznets-1.0/tests/io/test_util.py +190 -0
  123. kuznets-1.0/tests/test_bankofcanada.py +76 -0
  124. kuznets-1.0/tests/test_base.py +288 -0
  125. kuznets-1.0/tests/test_config.py +112 -0
  126. kuznets-1.0/tests/test_data.py +61 -0
  127. kuznets-1.0/tests/test_econdb.py +88 -0
  128. kuznets-1.0/tests/test_eurostat.py +69 -0
  129. kuznets-1.0/tests/test_famafrench.py +177 -0
  130. kuznets-1.0/tests/test_fred.py +139 -0
  131. kuznets-1.0/tests/test_moex.py +76 -0
  132. kuznets-1.0/tests/test_nasdaq.py +101 -0
  133. kuznets-1.0/tests/test_naver.py +67 -0
  134. kuznets-1.0/tests/test_oecd.py +73 -0
  135. kuznets-1.0/tests/test_output.py +336 -0
  136. kuznets-1.0/tests/test_quandl.py +197 -0
  137. kuznets-1.0/tests/test_stooq.py +95 -0
  138. kuznets-1.0/tests/test_tiingo.py +156 -0
  139. kuznets-1.0/tests/test_tsp.py +54 -0
  140. kuznets-1.0/tests/test_utils.py +46 -0
  141. kuznets-1.0/tests/test_wb.py +185 -0
  142. kuznets-1.0/tests/yahoo/__init__.py +0 -0
  143. kuznets-1.0/tests/yahoo/data/__init__.py +0 -0
  144. kuznets-1.0/tests/yahoo/data/yahoo_options1.json +2 -0
  145. kuznets-1.0/tests/yahoo/data/yahoo_options2.json +1 -0
  146. kuznets-1.0/tests/yahoo/test_options.py +111 -0
  147. kuznets-1.0/tests/yahoo/test_yahoo.py +404 -0
@@ -0,0 +1,11 @@
1
+ codecov:
2
+ notify:
3
+ require_ci_to_pass: no
4
+ coverage:
5
+ status:
6
+ project:
7
+ default:
8
+ # Require 1% coverage, i.e., always succeed
9
+ target: 1
10
+ patch: false
11
+ changes: false
@@ -0,0 +1,26 @@
1
+ # Mostly taken verbatim from https://github.com/pymc-devs/pymc/blob/main/.github/release.yml
2
+ #
3
+ # This file contains configuration for the automatic generation of release notes in GitHub.
4
+ # Also see https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes
5
+ changelog:
6
+ exclude:
7
+ labels:
8
+ - no releasenotes
9
+ categories:
10
+ - title: Major Changes 🛠
11
+ labels:
12
+ - major
13
+ - title: New Features 🎉
14
+ labels:
15
+ - enhancement
16
+ - feature request
17
+ - title: Bugfixes 🐛
18
+ labels:
19
+ - bug
20
+ - title: Documentation 📖
21
+ labels:
22
+ - docs
23
+ - documentation
24
+ - title: Maintenance 🔧
25
+ labels:
26
+ - "*"
@@ -0,0 +1,58 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ pre-commit:
11
+ name: Pre-Commit
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
15
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
16
+ with:
17
+ python-version: "3.12"
18
+ - uses: prefix-dev/setup-pixi@a09b6247153796b190642a2b53fac4241043cf6f # v0.10.0
19
+ with:
20
+ pixi-version: v0.70.2
21
+ run-install: false
22
+ - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
23
+
24
+ tests:
25
+ name: Tests (${{ matrix.os }}, ${{ matrix.environment }})
26
+ needs: pre-commit
27
+ runs-on: ${{ matrix.os }}
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ os: [ubuntu-latest, windows-latest]
32
+ environment: [default, py313, py314]
33
+
34
+ steps:
35
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
36
+ with:
37
+ fetch-depth: 0 # needed for hatch-vcs
38
+
39
+ - uses: prefix-dev/setup-pixi@a09b6247153796b190642a2b53fac4241043cf6f # v0.10.0
40
+ with:
41
+ pixi-version: v0.70.2
42
+ environments: ${{ matrix.environment }}
43
+ cache: true
44
+
45
+ - name: List installed packages
46
+ run: pixi list -e ${{ matrix.environment }}
47
+
48
+ - name: Run tests
49
+ run: pixi run -e ${{ matrix.environment }} test-cov
50
+
51
+ - name: Upload coverage to Codecov
52
+ if: always()
53
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
54
+ with:
55
+ token: ${{ secrets.CODECOV_TOKEN }}
56
+ files: coverage.xml
57
+ flags: ${{ matrix.os }}-${{ matrix.environment }}
58
+ fail_ci_if_error: false
@@ -0,0 +1,64 @@
1
+ name: Refresh test fixtures
2
+
3
+ # Re-records the offline test fixtures from the live services and verifies their shape. Runs weekly
4
+ # (and on demand). Push/PR CI stays fully offline; only this job touches the network.
5
+ on:
6
+ schedule:
7
+ - cron: "0 6 * * 1" # Mondays 06:00 UTC
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: write
12
+ pull-requests: write
13
+
14
+ jobs:
15
+ refresh:
16
+ name: Record fixtures and open PR on drift
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
20
+ with:
21
+ fetch-depth: 0 # needed for hatch-vcs
22
+
23
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
24
+ with:
25
+ python-version: "3.12"
26
+
27
+ - name: Install package and dev dependencies
28
+ run: |
29
+ python -m pip install --upgrade pip
30
+ python -m pip install -e ".[dev]"
31
+
32
+ - name: Record fixtures from live services
33
+ id: record
34
+ continue-on-error: true
35
+ env:
36
+ RECORD: "1"
37
+ # Optional: set these as repo secrets to also record the keyed readers.
38
+ ALPHAVANTAGE_API_KEY: ${{ secrets.ALPHAVANTAGE_API_KEY }}
39
+ QUANDL_API_KEY: ${{ secrets.QUANDL_API_KEY }}
40
+ TIINGO_API_KEY: ${{ secrets.TIINGO_API_KEY }}
41
+ run: pytest -m network -o addopts="" -rs
42
+
43
+ - name: Verify offline suite replays the refreshed fixtures
44
+ run: pytest
45
+
46
+ - name: Open PR with refreshed fixtures
47
+ if: always()
48
+ uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
49
+ with:
50
+ branch: bot/refresh-fixtures
51
+ title: "test: refresh recorded fixtures"
52
+ commit-message: "test: refresh recorded fixtures from live services"
53
+ body: |
54
+ Automated weekly refresh of the recorded responses under `tests/data/`.
55
+
56
+ If this PR is empty, the live responses still match. If the live-recording step
57
+ failed, an upstream API shape changed — review the diff and the failed run before merging.
58
+ add-paths: tests/data
59
+
60
+ - name: Fail the run if live recording detected drift
61
+ if: steps.record.outcome == 'failure'
62
+ run: |
63
+ echo "Live recording reported a failure (likely an upstream API shape change)."
64
+ exit 1
@@ -0,0 +1,36 @@
1
+ name: PyPI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+ release:
9
+ types: [published]
10
+
11
+ jobs:
12
+ build:
13
+ name: build and inspect the package
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
17
+ with:
18
+ fetch-depth: 0
19
+ - uses: hynek/build-and-inspect-python-package@d44ca7d91762de7a7d5436ddae667c6da6d1c3df # v2.18.0
20
+
21
+ publish:
22
+ name: upload release to PyPI
23
+ needs: [build]
24
+ runs-on: ubuntu-latest
25
+ if: github.repository_owner == 'jessegrabowski' && github.event_name == 'release' && github.event.action == 'published'
26
+ # The release GitHub environment protects Trusted Publishing (OIDC) behind maintainer signoff.
27
+ environment: release
28
+ permissions:
29
+ # write id-token is necessary for trusted publishing (OIDC)
30
+ id-token: write
31
+ steps:
32
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
33
+ with:
34
+ name: Packages
35
+ path: dist
36
+ - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
kuznets-1.0/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ __pycache__
2
+ *.pyc
3
+ *.egg-info
4
+ .coverage
5
+ build
6
+ dist
7
+ docs/build
8
+ .tox/
9
+ .cache/
10
+ .idea
11
+ *.iml
12
+ *~
13
+ env/
14
+ .pytest_cache/
15
+ .vscode/
16
+ scratch.py
17
+ .pixi/
18
+ coverage.xml
19
+ junit/
20
+ cache.sqlite
21
+ docs/source/_version.txt
@@ -0,0 +1,36 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v6.0.0
4
+ hooks:
5
+ - id: check-merge-conflict
6
+ - id: check-toml
7
+ - id: check-yaml
8
+ - id: debug-statements
9
+ - id: end-of-file-fixer
10
+ exclude: ^tests/data/
11
+ - id: trailing-whitespace
12
+ exclude: ^tests/data/
13
+
14
+ - repo: https://github.com/astral-sh/ruff-pre-commit
15
+ rev: v0.12.8
16
+ hooks:
17
+ - id: ruff
18
+ args: [ --fix, --exit-non-zero-on-fix ]
19
+ exclude: \.md$
20
+ - id: ruff-format
21
+ types_or: [ python, pyi ]
22
+
23
+ - repo: https://github.com/MarcoGorelli/absolufy-imports
24
+ rev: v0.3.1
25
+ hooks:
26
+ - id: absolufy-imports
27
+ types: [python]
28
+
29
+ - repo: local
30
+ hooks:
31
+ - id: pixi-lock-check
32
+ name: pixi.lock is in sync with pyproject.toml
33
+ entry: pixi lock --check
34
+ language: system
35
+ files: ^(pyproject\.toml|pixi\.lock)$
36
+ pass_filenames: false
kuznets-1.0/LICENSE.md ADDED
@@ -0,0 +1,49 @@
1
+ =======
2
+ License
3
+ =======
4
+
5
+ kuznets license
6
+ ===============
7
+
8
+ Copyright (c) 2026, Jesse Grabowski
9
+ All rights reserved.
10
+
11
+ kuznets is a fork of pandas-datareader and is distributed under the same 3-clause BSD license,
12
+ reproduced below with its original copyright notices.
13
+
14
+ pandas-datareader license
15
+ =========================
16
+
17
+ Copyright (c) 2011-2012, Lambda Foundry, Inc. and PyData Development Team
18
+ All rights reserved.
19
+
20
+ Copyright (c) 2008-2011 AQR Capital Management, LLC
21
+ All rights reserved.
22
+
23
+ Redistribution and use in source and binary forms, with or without
24
+ modification, are permitted provided that the following conditions are
25
+ met:
26
+
27
+ * Redistributions of source code must retain the above copyright
28
+ notice, this list of conditions and the following disclaimer.
29
+
30
+ * Redistributions in binary form must reproduce the above
31
+ copyright notice, this list of conditions and the following
32
+ disclaimer in the documentation and/or other materials provided
33
+ with the distribution.
34
+
35
+ * Neither the name of the copyright holder nor the names of any
36
+ contributors may be used to endorse or promote products derived
37
+ from this software without specific prior written permission.
38
+
39
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
40
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
41
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
42
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
43
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
45
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
46
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
47
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
48
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
49
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kuznets-1.0/PKG-INFO ADDED
@@ -0,0 +1,177 @@
1
+ Metadata-Version: 2.4
2
+ Name: kuznets
3
+ Version: 1.0
4
+ Summary: Economic and financial data readers for pandas, polars, pyarrow, and dask.
5
+ Project-URL: Homepage, https://github.com/jessegrabowski/kuznets
6
+ Project-URL: Documentation, https://kuznets.readthedocs.io/en/latest/
7
+ Project-URL: Repository, https://github.com/jessegrabowski/kuznets.git
8
+ Project-URL: Bug Tracker, https://github.com/jessegrabowski/kuznets/issues
9
+ Author-email: Jesse Grabowski <jessegrabowski@gmail.com>
10
+ License-Expression: BSD-3-Clause
11
+ License-File: LICENSE.md
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Scientific/Engineering
23
+ Requires-Python: >=3.12
24
+ Requires-Dist: lxml
25
+ Requires-Dist: narwhals>=2.0
26
+ Requires-Dist: pandas>=3.0
27
+ Requires-Dist: requests
28
+ Provides-Extra: backends
29
+ Requires-Dist: dask[dataframe]; extra == 'backends'
30
+ Requires-Dist: polars; extra == 'backends'
31
+ Requires-Dist: pyarrow; extra == 'backends'
32
+ Provides-Extra: dask
33
+ Requires-Dist: dask[dataframe]; extra == 'dask'
34
+ Provides-Extra: dev
35
+ Requires-Dist: coverage; extra == 'dev'
36
+ Requires-Dist: dask[dataframe]; extra == 'dev'
37
+ Requires-Dist: polars; extra == 'dev'
38
+ Requires-Dist: pre-commit; extra == 'dev'
39
+ Requires-Dist: pyarrow; extra == 'dev'
40
+ Requires-Dist: pytest-cov; extra == 'dev'
41
+ Requires-Dist: pytest-xdist; extra == 'dev'
42
+ Requires-Dist: pytest>=8; extra == 'dev'
43
+ Requires-Dist: ruff; extra == 'dev'
44
+ Requires-Dist: wrapt; extra == 'dev'
45
+ Provides-Extra: docs
46
+ Requires-Dist: ipython; extra == 'docs'
47
+ Requires-Dist: matplotlib; extra == 'docs'
48
+ Requires-Dist: pickleshare; extra == 'docs'
49
+ Requires-Dist: pydata-sphinx-theme; extra == 'docs'
50
+ Requires-Dist: requests-cache; extra == 'docs'
51
+ Requires-Dist: sphinx; extra == 'docs'
52
+ Provides-Extra: polars
53
+ Requires-Dist: polars; extra == 'polars'
54
+ Requires-Dist: pyarrow; extra == 'polars'
55
+ Provides-Extra: pyarrow
56
+ Requires-Dist: pyarrow; extra == 'pyarrow'
57
+ Description-Content-Type: text/markdown
58
+
59
+ # kuznets
60
+
61
+ Remote data access for economic and financial data — FRED, OECD, Eurostat, World Bank,
62
+ Fama-French, Yahoo Finance, and more — returned as pandas, polars, pyarrow, or dask frames.
63
+
64
+ kuznets is a fork of [pydata/pandas-datareader](https://github.com/pydata/pandas-datareader).
65
+
66
+ [![PyPI](https://img.shields.io/pypi/v/kuznets.svg)](https://pypi.org/project/kuznets/)
67
+ [![Coverage](https://codecov.io/gh/jessegrabowski/kuznets/branch/main/graph/badge.svg)](https://codecov.io/gh/jessegrabowski/kuznets)
68
+ [![License](https://img.shields.io/pypi/l/kuznets)](https://pypi.org/project/kuznets/)
69
+
70
+ ## Installation
71
+
72
+ Install using `pip`
73
+
74
+ ``` shell
75
+ pip install kuznets
76
+ ```
77
+
78
+ ## Usage
79
+
80
+ ``` python
81
+ import kuznets as kz
82
+ kz.get_data_fred('GS10')
83
+ ```
84
+
85
+ Every reader accepts an `output_type` argument to return polars, pyarrow, or dask frames instead of
86
+ pandas, and multi-symbol daily reads fetch concurrently (tune with `max_workers`):
87
+
88
+ ``` python
89
+ kz.DataReader(["AAPL", "MSFT"], "stooq", output_type="polars", max_workers=8)
90
+ ```
91
+
92
+ ## Documentation
93
+
94
+ [Stable documentation](https://pydata.github.io/kuznets/) is available on
95
+ [github.io](https://pydata.github.io/kuznets/). A second copy of the stable
96
+ documentation is hosted on [read the docs](https://kuznets.readthedocs.io/)
97
+ for more details.
98
+
99
+ [Development documentation](https://pydata.github.io/kuznets/devel/) is available
100
+ for the latest changes in master.
101
+
102
+ ### Requirements
103
+
104
+ Using kuznets requires the following packages:
105
+
106
+ - pandas>=3.0
107
+ - narwhals>=2.0
108
+ - lxml
109
+ - requests
110
+
111
+ Non-pandas output backends are optional extras:
112
+
113
+ ``` shell
114
+ pip install kuznets[polars] # or [pyarrow], [dask], [backends]
115
+ ```
116
+
117
+ Building the documentation additionally requires:
118
+
119
+ - matplotlib
120
+ - ipython
121
+ - requests_cache
122
+ - sphinx
123
+ - pydata_sphinx_theme
124
+
125
+ Development and testing dependencies are defined in `pyproject.toml`: the `dev` extra for pip
126
+ workflows, and the pixi `test`/`lint` features for the pixi workspace.
127
+
128
+ ### Install latest development version
129
+
130
+ ``` shell
131
+ python -m pip install git+https://github.com/jessegrabowski/kuznets.git
132
+ ```
133
+
134
+ or
135
+
136
+ ``` shell
137
+ git clone https://github.com/jessegrabowski/kuznets.git
138
+ cd kuznets
139
+ python setup.py install
140
+ ```
141
+
142
+ ### Development environment
143
+
144
+ The repo is a [pixi](https://pixi.sh) workspace: `pixi install` creates the dev environment
145
+ (editable install, test and lint tools), `pixi run test` runs the suite, and `pixi run -e py314
146
+ test` runs it on another Python. `pip install -e ".[dev]"` in a virtualenv works too.
147
+
148
+ ### Running the tests
149
+
150
+ The test suite runs fully offline by default: each reader is replayed against a **recorded real
151
+ response** stored under `tests/data/`, so no third-party service is contacted.
152
+
153
+ ``` shell
154
+ pytest
155
+ ```
156
+
157
+ Tests marked `network` are deselected by default. Each one runs a reader against the live service
158
+ and asserts the *shape* of the result (columns, dtypes, non-empty) — an API-drift detector that
159
+ skips gracefully when a service is unreachable:
160
+
161
+ ``` shell
162
+ pytest -m network
163
+ ```
164
+
165
+ The offline fixtures are recordings, not hand-written mocks. To regenerate them from the live
166
+ services, run the `network` tests in record mode:
167
+
168
+ ``` shell
169
+ RECORD=1 pytest -m network
170
+ ```
171
+
172
+ This rewrites `tests/data/` from the real responses (and a wrong parser fails here, at record time,
173
+ rather than being hidden by a fixture built to match it). A weekly GitHub Actions workflow
174
+ (`refresh-fixtures`) does this automatically and opens a PR when a fixture changes, failing if an
175
+ upstream shape breaks. A few services can't be recorded and are documented in their tests: Stooq
176
+ serves an anti-bot challenge to scripted clients, and the keyed readers (AlphaVantage, Quandl,
177
+ Tiingo) need API keys.
kuznets-1.0/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # kuznets
2
+
3
+ Remote data access for economic and financial data — FRED, OECD, Eurostat, World Bank,
4
+ Fama-French, Yahoo Finance, and more — returned as pandas, polars, pyarrow, or dask frames.
5
+
6
+ kuznets is a fork of [pydata/pandas-datareader](https://github.com/pydata/pandas-datareader).
7
+
8
+ [![PyPI](https://img.shields.io/pypi/v/kuznets.svg)](https://pypi.org/project/kuznets/)
9
+ [![Coverage](https://codecov.io/gh/jessegrabowski/kuznets/branch/main/graph/badge.svg)](https://codecov.io/gh/jessegrabowski/kuznets)
10
+ [![License](https://img.shields.io/pypi/l/kuznets)](https://pypi.org/project/kuznets/)
11
+
12
+ ## Installation
13
+
14
+ Install using `pip`
15
+
16
+ ``` shell
17
+ pip install kuznets
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ``` python
23
+ import kuznets as kz
24
+ kz.get_data_fred('GS10')
25
+ ```
26
+
27
+ Every reader accepts an `output_type` argument to return polars, pyarrow, or dask frames instead of
28
+ pandas, and multi-symbol daily reads fetch concurrently (tune with `max_workers`):
29
+
30
+ ``` python
31
+ kz.DataReader(["AAPL", "MSFT"], "stooq", output_type="polars", max_workers=8)
32
+ ```
33
+
34
+ ## Documentation
35
+
36
+ [Stable documentation](https://pydata.github.io/kuznets/) is available on
37
+ [github.io](https://pydata.github.io/kuznets/). A second copy of the stable
38
+ documentation is hosted on [read the docs](https://kuznets.readthedocs.io/)
39
+ for more details.
40
+
41
+ [Development documentation](https://pydata.github.io/kuznets/devel/) is available
42
+ for the latest changes in master.
43
+
44
+ ### Requirements
45
+
46
+ Using kuznets requires the following packages:
47
+
48
+ - pandas>=3.0
49
+ - narwhals>=2.0
50
+ - lxml
51
+ - requests
52
+
53
+ Non-pandas output backends are optional extras:
54
+
55
+ ``` shell
56
+ pip install kuznets[polars] # or [pyarrow], [dask], [backends]
57
+ ```
58
+
59
+ Building the documentation additionally requires:
60
+
61
+ - matplotlib
62
+ - ipython
63
+ - requests_cache
64
+ - sphinx
65
+ - pydata_sphinx_theme
66
+
67
+ Development and testing dependencies are defined in `pyproject.toml`: the `dev` extra for pip
68
+ workflows, and the pixi `test`/`lint` features for the pixi workspace.
69
+
70
+ ### Install latest development version
71
+
72
+ ``` shell
73
+ python -m pip install git+https://github.com/jessegrabowski/kuznets.git
74
+ ```
75
+
76
+ or
77
+
78
+ ``` shell
79
+ git clone https://github.com/jessegrabowski/kuznets.git
80
+ cd kuznets
81
+ python setup.py install
82
+ ```
83
+
84
+ ### Development environment
85
+
86
+ The repo is a [pixi](https://pixi.sh) workspace: `pixi install` creates the dev environment
87
+ (editable install, test and lint tools), `pixi run test` runs the suite, and `pixi run -e py314
88
+ test` runs it on another Python. `pip install -e ".[dev]"` in a virtualenv works too.
89
+
90
+ ### Running the tests
91
+
92
+ The test suite runs fully offline by default: each reader is replayed against a **recorded real
93
+ response** stored under `tests/data/`, so no third-party service is contacted.
94
+
95
+ ``` shell
96
+ pytest
97
+ ```
98
+
99
+ Tests marked `network` are deselected by default. Each one runs a reader against the live service
100
+ and asserts the *shape* of the result (columns, dtypes, non-empty) — an API-drift detector that
101
+ skips gracefully when a service is unreachable:
102
+
103
+ ``` shell
104
+ pytest -m network
105
+ ```
106
+
107
+ The offline fixtures are recordings, not hand-written mocks. To regenerate them from the live
108
+ services, run the `network` tests in record mode:
109
+
110
+ ``` shell
111
+ RECORD=1 pytest -m network
112
+ ```
113
+
114
+ This rewrites `tests/data/` from the real responses (and a wrong parser fails here, at record time,
115
+ rather than being hidden by a fixture built to match it). A weekly GitHub Actions workflow
116
+ (`refresh-fixtures`) does this automatically and opens a PR when a fixture changes, failing if an
117
+ upstream shape breaks. A few services can't be recorded and are documented in their tests: Stooq
118
+ serves an anti-bot challenge to scripted clients, and the keyed readers (AlphaVantage, Quandl,
119
+ Tiingo) need API keys.
@@ -0,0 +1,12 @@
1
+ coverage:
2
+ status:
3
+ project:
4
+ default:
5
+ informational: true
6
+ patch:
7
+ default:
8
+ informational: true
9
+
10
+ comment:
11
+ layout: "condensed_header, diff, flags"
12
+ require_changes: true
@@ -0,0 +1,20 @@
1
+ # Minimal makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line.
5
+ SPHINXOPTS =
6
+ SPHINXBUILD = sphinx-build
7
+ SPHINXPROJ = kuznets
8
+ SOURCEDIR = source
9
+ BUILDDIR = build
10
+
11
+ # Put it first so that "make" without argument is like "make help".
12
+ help:
13
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
+
15
+ .PHONY: help Makefile
16
+
17
+ # Catch-all target: route all unknown targets to Sphinx using the new
18
+ # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19
+ %: Makefile
20
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@@ -0,0 +1,29 @@
1
+ """
2
+ Get a list of contributors between now and a start date
3
+ """
4
+
5
+ import datetime as dt
6
+ import os
7
+
8
+ from github import Github
9
+
10
+ # or using an access token
11
+ g = Github(os.environ.get("GITHUB_API_KEY"))
12
+
13
+ repo = g.get_repo("jessegrabowski/kuznets")
14
+
15
+ start = dt.datetime(2019, 9, 26, 0, 0, 0)
16
+ pulls = repo.get_pulls(state="closed", sort="updated", base="master", direction="desc")
17
+
18
+ users = set()
19
+ for i, p in enumerate(pulls):
20
+ print(f"{i}: {p.number}")
21
+ if p.merged and p.merged_at >= start:
22
+ users.update([p.user.name])
23
+ if p.updated_at < start:
24
+ break
25
+
26
+ contrib = sorted((c for c in users if c), key=lambda s: s.split(" ")[-1])
27
+
28
+ for c in contrib:
29
+ print(f"- {c}")