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.
- kuznets-1.0/.codecov.yml +11 -0
- kuznets-1.0/.github/release.yml +26 -0
- kuznets-1.0/.github/workflows/ci.yml +58 -0
- kuznets-1.0/.github/workflows/refresh-fixtures.yml +64 -0
- kuznets-1.0/.github/workflows/release.yml +36 -0
- kuznets-1.0/.gitignore +21 -0
- kuznets-1.0/.pre-commit-config.yaml +36 -0
- kuznets-1.0/LICENSE.md +49 -0
- kuznets-1.0/PKG-INFO +177 -0
- kuznets-1.0/README.md +119 -0
- kuznets-1.0/codecov.yml +12 -0
- kuznets-1.0/docs/Makefile +20 -0
- kuznets-1.0/docs/contributors.py +29 -0
- kuznets-1.0/docs/make.bat +36 -0
- kuznets-1.0/docs/requirements.txt +1 -0
- kuznets-1.0/docs/source/cache.rst +54 -0
- kuznets-1.0/docs/source/conf.py +206 -0
- kuznets-1.0/docs/source/configuration.rst +70 -0
- kuznets-1.0/docs/source/index.rst +87 -0
- kuznets-1.0/docs/source/readers/alphavantage.rst +15 -0
- kuznets-1.0/docs/source/readers/bank-of-canada.rst +8 -0
- kuznets-1.0/docs/source/readers/econdb.rst +8 -0
- kuznets-1.0/docs/source/readers/eurostat.rst +8 -0
- kuznets-1.0/docs/source/readers/famafrench.rst +10 -0
- kuznets-1.0/docs/source/readers/fred.rst +8 -0
- kuznets-1.0/docs/source/readers/index.rst +22 -0
- kuznets-1.0/docs/source/readers/moex.rst +8 -0
- kuznets-1.0/docs/source/readers/nasdaq-trader.rst +6 -0
- kuznets-1.0/docs/source/readers/naver.rst +8 -0
- kuznets-1.0/docs/source/readers/oecd.rst +8 -0
- kuznets-1.0/docs/source/readers/quandl.rst +8 -0
- kuznets-1.0/docs/source/readers/stooq.rst +8 -0
- kuznets-1.0/docs/source/readers/tiingo.rst +18 -0
- kuznets-1.0/docs/source/readers/tsp.rst +8 -0
- kuznets-1.0/docs/source/readers/world-bank.rst +16 -0
- kuznets-1.0/docs/source/readers/yahoo.rst +46 -0
- kuznets-1.0/docs/source/remote_data.rst +758 -0
- kuznets-1.0/docs/source/see-also.rst +40 -0
- kuznets-1.0/kuznets/__init__.py +74 -0
- kuznets-1.0/kuznets/_output.py +337 -0
- kuznets-1.0/kuznets/_testing.py +29 -0
- kuznets-1.0/kuznets/_utils.py +128 -0
- kuznets-1.0/kuznets/av/__init__.py +111 -0
- kuznets-1.0/kuznets/av/forex.py +124 -0
- kuznets-1.0/kuznets/av/time_series.py +154 -0
- kuznets-1.0/kuznets/bankofcanada.py +49 -0
- kuznets-1.0/kuznets/base.py +674 -0
- kuznets-1.0/kuznets/compat/__init__.py +33 -0
- kuznets-1.0/kuznets/config.py +211 -0
- kuznets-1.0/kuznets/conftest.py +60 -0
- kuznets-1.0/kuznets/data.py +522 -0
- kuznets-1.0/kuznets/econdb.py +151 -0
- kuznets-1.0/kuznets/eurostat.py +47 -0
- kuznets-1.0/kuznets/famafrench.py +183 -0
- kuznets-1.0/kuznets/fred.py +100 -0
- kuznets-1.0/kuznets/io/__init__.py +3 -0
- kuznets-1.0/kuznets/io/jsdmx.py +49 -0
- kuznets-1.0/kuznets/io/jstat.py +54 -0
- kuznets-1.0/kuznets/io/sdmx.py +237 -0
- kuznets-1.0/kuznets/io/util.py +192 -0
- kuznets-1.0/kuznets/moex.py +258 -0
- kuznets-1.0/kuznets/nasdaq_trader.py +137 -0
- kuznets-1.0/kuznets/naver.py +161 -0
- kuznets-1.0/kuznets/oecd.py +57 -0
- kuznets-1.0/kuznets/quandl.py +184 -0
- kuznets-1.0/kuznets/stooq.py +52 -0
- kuznets-1.0/kuznets/tiingo.py +387 -0
- kuznets-1.0/kuznets/tsp.py +116 -0
- kuznets-1.0/kuznets/wb.py +931 -0
- kuznets-1.0/kuznets/yahoo/__init__.py +0 -0
- kuznets-1.0/kuznets/yahoo/_auth.py +28 -0
- kuznets-1.0/kuznets/yahoo/actions.py +93 -0
- kuznets-1.0/kuznets/yahoo/daily.py +235 -0
- kuznets-1.0/kuznets/yahoo/fundamentals.py +331 -0
- kuznets-1.0/kuznets/yahoo/fx.py +114 -0
- kuznets-1.0/kuznets/yahoo/headers.py +14 -0
- kuznets-1.0/kuznets/yahoo/options.py +804 -0
- kuznets-1.0/kuznets/yahoo/quotes.py +71 -0
- kuznets-1.0/pixi.lock +14636 -0
- kuznets-1.0/pyproject.toml +187 -0
- kuznets-1.0/tests/__init__.py +0 -0
- kuznets-1.0/tests/_backends.py +22 -0
- kuznets-1.0/tests/_mock.py +242 -0
- kuznets-1.0/tests/av/__init__.py +0 -0
- kuznets-1.0/tests/av/test_av_forex.py +84 -0
- kuznets-1.0/tests/av/test_av_time_series.py +253 -0
- kuznets-1.0/tests/conftest.py +79 -0
- kuznets-1.0/tests/data/bankofcanada/fx_usd_cad.csv +29 -0
- kuznets-1.0/tests/data/eurostat/ert_h_eur_a.json +1 -0
- kuznets-1.0/tests/data/famafrench/F-F_Research_Data_Factors_CSV.zip +0 -0
- kuznets-1.0/tests/data/famafrench/F-F_Research_Data_Factors_daily_CSV.zip +0 -0
- kuznets-1.0/tests/data/famafrench/ME_Breakpoints_CSV.zip +0 -0
- kuznets-1.0/tests/data/famafrench/Prior_2-12_Breakpoints_CSV.zip +0 -0
- kuznets-1.0/tests/data/famafrench/data_library.html +6 -0
- kuznets-1.0/tests/data/fred/dfii5.csv +7 -0
- kuznets-1.0/tests/data/fred/gdp.csv +14 -0
- kuznets-1.0/tests/data/fred/gdp_api.json +9 -0
- kuznets-1.0/tests/data/moex/sber_history.csv +5 -0
- kuznets-1.0/tests/data/moex/sber_meta.csv +86 -0
- kuznets-1.0/tests/data/nasdaq/nasdaqtraded.txt +6 -0
- kuznets-1.0/tests/data/naver/005930.xml +9 -0
- kuznets-1.0/tests/data/oecd/tud.json +1 -0
- kuznets-1.0/tests/data/stooq/spy.csv +10 -0
- kuznets-1.0/tests/data/wb/bad_indicator.json +7 -0
- kuznets-1.0/tests/data/wb/countries.json +1 -0
- kuznets-1.0/tests/data/wb/country_jp_gdp.json +1 -0
- kuznets-1.0/tests/data/wb/indicators.json +41 -0
- kuznets-1.0/tests/data/yahoo/chart_aapl_2020.json +1 -0
- kuznets-1.0/tests/data/yahoo/chart_empty.json +1 -0
- kuznets-1.0/tests/data/yahoo/fundamentals_aapl.json +1 -0
- kuznets-1.0/tests/data/yahoo/options_aapl.json +1 -0
- kuznets-1.0/tests/data/yahoo/quote_aapl_goog.json +1 -0
- kuznets-1.0/tests/io/__init__.py +0 -0
- kuznets-1.0/tests/io/data/jsdmx/__init__.py +0 -0
- kuznets-1.0/tests/io/data/jsdmx/oecd_tud.json +1 -0
- kuznets-1.0/tests/io/data/sdmx/DSD_cdh_e_fos.xml +345 -0
- kuznets-1.0/tests/io/data/sdmx/__init__.py +0 -0
- kuznets-1.0/tests/io/data/sdmx/cdh_e_fos.xml +1 -0
- kuznets-1.0/tests/io/test_jsdmx.py +24 -0
- kuznets-1.0/tests/io/test_jstat.py +61 -0
- kuznets-1.0/tests/io/test_sdmx.py +38 -0
- kuznets-1.0/tests/io/test_util.py +190 -0
- kuznets-1.0/tests/test_bankofcanada.py +76 -0
- kuznets-1.0/tests/test_base.py +288 -0
- kuznets-1.0/tests/test_config.py +112 -0
- kuznets-1.0/tests/test_data.py +61 -0
- kuznets-1.0/tests/test_econdb.py +88 -0
- kuznets-1.0/tests/test_eurostat.py +69 -0
- kuznets-1.0/tests/test_famafrench.py +177 -0
- kuznets-1.0/tests/test_fred.py +139 -0
- kuznets-1.0/tests/test_moex.py +76 -0
- kuznets-1.0/tests/test_nasdaq.py +101 -0
- kuznets-1.0/tests/test_naver.py +67 -0
- kuznets-1.0/tests/test_oecd.py +73 -0
- kuznets-1.0/tests/test_output.py +336 -0
- kuznets-1.0/tests/test_quandl.py +197 -0
- kuznets-1.0/tests/test_stooq.py +95 -0
- kuznets-1.0/tests/test_tiingo.py +156 -0
- kuznets-1.0/tests/test_tsp.py +54 -0
- kuznets-1.0/tests/test_utils.py +46 -0
- kuznets-1.0/tests/test_wb.py +185 -0
- kuznets-1.0/tests/yahoo/__init__.py +0 -0
- kuznets-1.0/tests/yahoo/data/__init__.py +0 -0
- kuznets-1.0/tests/yahoo/data/yahoo_options1.json +2 -0
- kuznets-1.0/tests/yahoo/data/yahoo_options2.json +1 -0
- kuznets-1.0/tests/yahoo/test_options.py +111 -0
- kuznets-1.0/tests/yahoo/test_yahoo.py +404 -0
kuznets-1.0/.codecov.yml
ADDED
|
@@ -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
|
+
[](https://pypi.org/project/kuznets/)
|
|
67
|
+
[](https://codecov.io/gh/jessegrabowski/kuznets)
|
|
68
|
+
[](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
|
+
[](https://pypi.org/project/kuznets/)
|
|
9
|
+
[](https://codecov.io/gh/jessegrabowski/kuznets)
|
|
10
|
+
[](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.
|
kuznets-1.0/codecov.yml
ADDED
|
@@ -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}")
|