datapungi_fed 0.5.0__py3-none-any.whl
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.
- datapungi_fed/__init__.py +71 -0
- datapungi_fed/api.py +98 -0
- datapungi_fed/codegen.py +109 -0
- datapungi_fed/config/__init__.py +0 -0
- datapungi_fed/config/datasetlist.yaml +499 -0
- datapungi_fed/config/pkgConfig.yaml +1 -0
- datapungi_fed/config/userSettings.json +1 -0
- datapungi_fed/connection.py +56 -0
- datapungi_fed/core.py +222 -0
- datapungi_fed/drivers.py +37 -0
- datapungi_fed/groups.py +99 -0
- datapungi_fed/tests/__init__.py +3 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-None-args0-kwargs0].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-category-args1-kwargs1].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-children-args2-kwargs2].yaml +54 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-related-args3-kwargs3].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-related_tags-args6-kwargs6].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-series-args4-kwargs4].yaml +304 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[categories-tags-args5-kwargs5].yaml +74 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[geo-None-args32-kwargs32].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[geo-meta-args34-kwargs34].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[geo-shapes-args33-kwargs33].yaml +56 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-None-args7-kwargs7].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-dates-args10-kwargs10].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-related_tags-args14-kwargs14].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-release-args9-kwargs9].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-releases-args8-kwargs8].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-series-args11-kwargs11].yaml +5225 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-sources-args12-kwargs12].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-tables-args15-kwargs15].yaml +58 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[releases-tags-args13-kwargs13].yaml +480 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-categories-args17-kwargs17].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-release-args18-kwargs18].yaml +53 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-search-args19-kwargs19].yaml +8535 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-search-related_tags-args21-kwargs21].yaml +67 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-search-tags-args20-kwargs20].yaml +443 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-series-args16-kwargs16].yaml +58 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-tags-args22-kwargs22].yaml +61 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-updates-args23-kwargs23].yaml +5078 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[series-vintagedates-args24-kwargs24].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[sources-releases-args31-kwargs31].yaml +222 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[sources-source-args30-kwargs30].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[sources-sources-args29-kwargs29].yaml +205 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-None-args25-kwargs25].yaml +63 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-related_tags-args27-kwargs27].yaml +63 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-series-args28-kwargs28].yaml +194 -0
- datapungi_fed/tests/cassettes/test_drivers/test_code_string[tags-tags-args26-kwargs26].yaml +52 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-None-args0-kwargs0].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-category-args1-kwargs1].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-children-args2-kwargs2].yaml +54 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-related-args3-kwargs3].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-related_tags-args6-kwargs6].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-series-args4-kwargs4].yaml +304 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[categories-tags-args5-kwargs5].yaml +74 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[geo-None-args32-kwargs32].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[geo-meta-args34-kwargs34].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[geo-shapes-args33-kwargs33].yaml +56 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-None-args7-kwargs7].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-dates-args10-kwargs10].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-related_tags-args14-kwargs14].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-release-args9-kwargs9].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-releases-args8-kwargs8].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-series-args11-kwargs11].yaml +5225 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-sources-args12-kwargs12].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-tables-args15-kwargs15].yaml +58 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[releases-tags-args13-kwargs13].yaml +480 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-categories-args17-kwargs17].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-release-args18-kwargs18].yaml +53 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-search-args19-kwargs19].yaml +8535 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-search-related_tags-args21-kwargs21].yaml +67 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-search-tags-args20-kwargs20].yaml +443 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-series-args16-kwargs16].yaml +58 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-tags-args22-kwargs22].yaml +61 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-updates-args23-kwargs23].yaml +5078 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[series-vintagedates-args24-kwargs24].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[sources-releases-args31-kwargs31].yaml +222 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[sources-source-args30-kwargs30].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[sources-sources-args29-kwargs29].yaml +205 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-None-args25-kwargs25].yaml +63 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-related_tags-args27-kwargs27].yaml +63 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-series-args28-kwargs28].yaml +194 -0
- datapungi_fed/tests/cassettes/test_drivers/test_dataframe[tags-tags-args26-kwargs26].yaml +52 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-None-args0-kwargs0].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-category-args1-kwargs1].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-children-args2-kwargs2].yaml +54 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-related-args3-kwargs3].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-related_tags-args6-kwargs6].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-series-args4-kwargs4].yaml +304 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[categories-tags-args5-kwargs5].yaml +74 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[geo-None-args32-kwargs32].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[geo-meta-args34-kwargs34].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[geo-shapes-args33-kwargs33].yaml +56 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-None-args7-kwargs7].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-dates-args10-kwargs10].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-related_tags-args14-kwargs14].yaml +59 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-release-args9-kwargs9].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-releases-args8-kwargs8].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-series-args11-kwargs11].yaml +5225 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-sources-args12-kwargs12].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-tables-args15-kwargs15].yaml +58 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[releases-tags-args13-kwargs13].yaml +480 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-categories-args17-kwargs17].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-release-args18-kwargs18].yaml +53 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-search-args19-kwargs19].yaml +8535 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-search-related_tags-args21-kwargs21].yaml +67 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-search-tags-args20-kwargs20].yaml +443 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-series-args16-kwargs16].yaml +58 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-tags-args22-kwargs22].yaml +61 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-updates-args23-kwargs23].yaml +5078 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[series-vintagedates-args24-kwargs24].yaml +50 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[sources-releases-args31-kwargs31].yaml +222 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[sources-source-args30-kwargs30].yaml +51 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[sources-sources-args29-kwargs29].yaml +205 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[tags-None-args25-kwargs25].yaml +63 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[tags-related_tags-args27-kwargs27].yaml +63 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[tags-series-args28-kwargs28].yaml +194 -0
- datapungi_fed/tests/cassettes/test_drivers/test_status[tags-tags-args26-kwargs26].yaml +52 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-None-args0-kwargs0].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-category-args1-kwargs1].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-children-args2-kwargs2].yaml +54 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-related-args3-kwargs3].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-related_tags-args6-kwargs6].yaml +59 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-series-args4-kwargs4].yaml +304 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[categories-tags-args5-kwargs5].yaml +74 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[geo-None-args32-kwargs32].yaml +59 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[geo-meta-args34-kwargs34].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[geo-shapes-args33-kwargs33].yaml +56 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-None-args7-kwargs7].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-dates-args10-kwargs10].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-related_tags-args14-kwargs14].yaml +59 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-release-args9-kwargs9].yaml +51 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-releases-args8-kwargs8].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-series-args11-kwargs11].yaml +5225 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-sources-args12-kwargs12].yaml +51 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-tables-args15-kwargs15].yaml +58 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[releases-tags-args13-kwargs13].yaml +480 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-categories-args17-kwargs17].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-release-args18-kwargs18].yaml +53 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-search-args19-kwargs19].yaml +8535 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-search-related_tags-args21-kwargs21].yaml +67 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-search-tags-args20-kwargs20].yaml +443 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-series-args16-kwargs16].yaml +58 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-tags-args22-kwargs22].yaml +61 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-updates-args23-kwargs23].yaml +5078 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[series-vintagedates-args24-kwargs24].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[sources-releases-args31-kwargs31].yaml +222 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[sources-source-args30-kwargs30].yaml +51 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[sources-sources-args29-kwargs29].yaml +205 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-None-args25-kwargs25].yaml +63 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-related_tags-args27-kwargs27].yaml +63 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-series-args28-kwargs28].yaml +194 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_dataframe[tags-tags-args26-kwargs26].yaml +52 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-None-args0-kwargs0].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-category-args1-kwargs1].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-children-args2-kwargs2].yaml +54 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-related-args3-kwargs3].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-related_tags-args6-kwargs6].yaml +59 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-series-args4-kwargs4].yaml +304 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[categories-tags-args5-kwargs5].yaml +74 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[geo-None-args32-kwargs32].yaml +59 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[geo-meta-args34-kwargs34].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[geo-shapes-args33-kwargs33].yaml +56 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-None-args7-kwargs7].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-dates-args10-kwargs10].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-related_tags-args14-kwargs14].yaml +59 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-release-args9-kwargs9].yaml +51 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-releases-args8-kwargs8].yaml +1584 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-series-args11-kwargs11].yaml +5225 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-sources-args12-kwargs12].yaml +51 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-tables-args15-kwargs15].yaml +58 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[releases-tags-args13-kwargs13].yaml +480 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-categories-args17-kwargs17].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-release-args18-kwargs18].yaml +53 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-search-args19-kwargs19].yaml +8535 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-search-related_tags-args21-kwargs21].yaml +67 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-search-tags-args20-kwargs20].yaml +443 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-series-args16-kwargs16].yaml +58 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-tags-args22-kwargs22].yaml +61 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-updates-args23-kwargs23].yaml +5078 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[series-vintagedates-args24-kwargs24].yaml +50 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[sources-releases-args31-kwargs31].yaml +222 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[sources-source-args30-kwargs30].yaml +51 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[sources-sources-args29-kwargs29].yaml +205 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-None-args25-kwargs25].yaml +63 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-related_tags-args27-kwargs27].yaml +63 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-series-args28-kwargs28].yaml +194 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_status[tags-tags-args26-kwargs26].yaml +52 -0
- datapungi_fed/tests/cassettes/test_driversCI/test_ts_multiple_series.yaml +98 -0
- datapungi_fed/tests/conftest.py +48 -0
- datapungi_fed/tests/main.py +57 -0
- datapungi_fed/tests/testResults/datapungi_fed_Tests.html +1094 -0
- datapungi_fed/tests/test_config.py +34 -0
- datapungi_fed/tests/test_drivers.py +103 -0
- datapungi_fed/tests/test_driversCI.py +106 -0
- datapungi_fed/tests/test_transform.py +157 -0
- datapungi_fed/transform.py +202 -0
- datapungi_fed/utils.py +248 -0
- datapungi_fed-0.5.0.dist-info/METADATA +275 -0
- datapungi_fed-0.5.0.dist-info/RECORD +201 -0
- datapungi_fed-0.5.0.dist-info/WHEEL +4 -0
- datapungi_fed-0.5.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Gets FRED and GeoFRED data from Federal Reserve (FED) by connecting to its API."""
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
import datapungi_fed.tests as tests
|
|
7
|
+
from datapungi_fed.api import Client
|
|
8
|
+
|
|
9
|
+
__version__ = '0.5.0'
|
|
10
|
+
|
|
11
|
+
_default_client: Client | None = None
|
|
12
|
+
|
|
13
|
+
_GROUP_NAMES = {
|
|
14
|
+
'datasetlist', 'category', 'release', 'series', 'source', 'tag', 'geo'
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
__all__ = ['Client', 'ts', 'tests', *_GROUP_NAMES]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def __dir__() -> list[str]:
|
|
21
|
+
"""Expose only the public, user-facing names for tab completion and help()."""
|
|
22
|
+
return sorted(set(__all__) | {'__version__'})
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _get_data() -> Client:
|
|
26
|
+
"""Return the lazily-initialized default module-level client."""
|
|
27
|
+
global _default_client
|
|
28
|
+
if _default_client is None:
|
|
29
|
+
_default_client = Client()
|
|
30
|
+
return _default_client
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __getattr__(name: str) -> Any:
|
|
34
|
+
"""Expose database group attributes at module level (e.g. ``dpf.series``)."""
|
|
35
|
+
if name in _GROUP_NAMES:
|
|
36
|
+
return getattr(_get_data(), name)
|
|
37
|
+
raise AttributeError(f"module 'datapungi_fed' has no attribute '{name}'")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def ts(*args: Any, **kwargs: Any) -> Any:
|
|
41
|
+
"""Quick time-series query — shortcut for ``dpf.series(...)``.
|
|
42
|
+
|
|
43
|
+
A list or tuple of series IDs can be passed to fetch multiple series and
|
|
44
|
+
merge them into a single ``DataFrame`` with one column per series.
|
|
45
|
+
"""
|
|
46
|
+
# Support dpf.ts(['gdp', 'gnp']) by fetching each series individually and
|
|
47
|
+
# concatenating along columns.
|
|
48
|
+
if (
|
|
49
|
+
len(args) == 1
|
|
50
|
+
and isinstance(args[0], (list, tuple))
|
|
51
|
+
and all(isinstance(t, str) for t in args[0])
|
|
52
|
+
):
|
|
53
|
+
tickers = list(args[0])
|
|
54
|
+
if not tickers:
|
|
55
|
+
return pd.DataFrame()
|
|
56
|
+
|
|
57
|
+
# verbose mode is per-series and not meaningful for a merged frame.
|
|
58
|
+
kwargs.pop('verbose', None)
|
|
59
|
+
|
|
60
|
+
frames: list[pd.DataFrame] = []
|
|
61
|
+
meta: dict[str, Any] = {}
|
|
62
|
+
for ticker in tickers:
|
|
63
|
+
df = getattr(_get_data(), 'series')(ticker, **kwargs)
|
|
64
|
+
frames.append(df)
|
|
65
|
+
meta[ticker] = df.attrs.get('meta', {})
|
|
66
|
+
|
|
67
|
+
combined = pd.concat(frames, axis=1, sort=True)
|
|
68
|
+
combined.attrs['meta'] = meta
|
|
69
|
+
return combined
|
|
70
|
+
|
|
71
|
+
return getattr(_get_data(), 'series')(*args, **kwargs)
|
datapungi_fed/api.py
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
from datapungi_fed import connection as settings
|
|
7
|
+
from datapungi_fed import drivers
|
|
8
|
+
from datapungi_fed.core import _load_datasetlist, _make_group_functions, _QueryExecutor
|
|
9
|
+
from datapungi_fed.groups import DriverGroup
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
# Singular user-facing attribute names for each database group.
|
|
14
|
+
_GROUP_ALIASES = {
|
|
15
|
+
'Categories': 'category',
|
|
16
|
+
'Releases': 'release',
|
|
17
|
+
'Series': 'series',
|
|
18
|
+
'Sources': 'source',
|
|
19
|
+
'Tags': 'tag',
|
|
20
|
+
'Geo': 'geo',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Client:
|
|
25
|
+
"""
|
|
26
|
+
Explicit client for the FRED and GeoFRED APIs.
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
api_key : str, dict, or None
|
|
31
|
+
FRED API key as a string, or a connection configuration dictionary,
|
|
32
|
+
or ``None`` to load the key from the ``API_KEY_FED`` environment
|
|
33
|
+
variable / package settings.
|
|
34
|
+
userSettings : dict, optional
|
|
35
|
+
Optional user settings dictionary.
|
|
36
|
+
"""
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
api_key: str | dict[str, Any] | None = None,
|
|
40
|
+
userSettings: dict[str, Any] | None = None,
|
|
41
|
+
):
|
|
42
|
+
self.__connectInfo = settings._get_connection_config(
|
|
43
|
+
connectionParameters=api_key, userSettings=userSettings
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
#specific drivers
|
|
47
|
+
self.datasetlist = drivers.datasetlist()
|
|
48
|
+
|
|
49
|
+
#core drivers: build one driver per YAML group, sharing a single query executor.
|
|
50
|
+
etdb = _QueryExecutor(
|
|
51
|
+
baseRequest = self.__connectInfo.baseRequest,
|
|
52
|
+
userSettings = self.__connectInfo.userSettings,
|
|
53
|
+
)
|
|
54
|
+
for dbGroupName in (entry['group'] for entry in _load_datasetlist()):
|
|
55
|
+
default_db_name, db_functions = _make_group_functions(dbGroupName, etdb)
|
|
56
|
+
default_db = db_functions[default_db_name]
|
|
57
|
+
attr_name = _GROUP_ALIASES.get(dbGroupName, dbGroupName.lower())
|
|
58
|
+
setattr(self, attr_name, DriverGroup(attr_name, default_db, db_functions))
|
|
59
|
+
|
|
60
|
+
def __call__(self, *args: Any, **kwargs: Any) -> Any:
|
|
61
|
+
return getattr(self, 'series')(*args, **kwargs)
|
|
62
|
+
|
|
63
|
+
def ts(self, *args: Any, **kwargs: Any) -> Any:
|
|
64
|
+
"""Quick time-series query — shortcut for ``self.series(...)``.
|
|
65
|
+
|
|
66
|
+
A list or tuple of series IDs can be passed to fetch multiple series
|
|
67
|
+
and merge them into a single ``DataFrame`` with one column per series.
|
|
68
|
+
"""
|
|
69
|
+
if (
|
|
70
|
+
len(args) == 1
|
|
71
|
+
and isinstance(args[0], (list, tuple))
|
|
72
|
+
and all(isinstance(t, str) for t in args[0])
|
|
73
|
+
):
|
|
74
|
+
tickers = list(args[0])
|
|
75
|
+
if not tickers:
|
|
76
|
+
return pd.DataFrame()
|
|
77
|
+
|
|
78
|
+
kwargs.pop('verbose', None)
|
|
79
|
+
|
|
80
|
+
frames: list[pd.DataFrame] = []
|
|
81
|
+
meta: dict[str, Any] = {}
|
|
82
|
+
for ticker in tickers:
|
|
83
|
+
df = self.series(ticker, **kwargs) # type: ignore[attr-defined]
|
|
84
|
+
frames.append(df)
|
|
85
|
+
meta[ticker] = df.attrs.get('meta', {})
|
|
86
|
+
|
|
87
|
+
combined = pd.concat(frames, axis=1, sort=True)
|
|
88
|
+
combined.attrs['meta'] = meta
|
|
89
|
+
return combined
|
|
90
|
+
|
|
91
|
+
return self.series(*args, **kwargs) # type: ignore[attr-defined]
|
|
92
|
+
|
|
93
|
+
def __str__(self) -> str:
|
|
94
|
+
return self.__doc__ or ''
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# Backward-compatible alias for internal code/tests.
|
|
98
|
+
_data = Client
|
datapungi_fed/codegen.py
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
r'''
|
|
2
|
+
Code snippet generation for reproducing queries with requests directly.
|
|
3
|
+
'''
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import logging
|
|
7
|
+
from textwrap import dedent
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class _CodeSnippetBuilder:
|
|
14
|
+
def build(
|
|
15
|
+
self,
|
|
16
|
+
query: dict[str, Any],
|
|
17
|
+
baseRequest: dict[str, Any],
|
|
18
|
+
userSettings: dict[str, Any] | None = None,
|
|
19
|
+
pandasCode: str = "",
|
|
20
|
+
) -> str:
|
|
21
|
+
if userSettings is None:
|
|
22
|
+
userSettings = {}
|
|
23
|
+
#load code header - get keys
|
|
24
|
+
apiCode = self._api_code(query,userSettings)
|
|
25
|
+
|
|
26
|
+
#load request's code
|
|
27
|
+
queryCode = self._query_code(query,baseRequest,pandasCode)
|
|
28
|
+
|
|
29
|
+
return(apiCode + queryCode)
|
|
30
|
+
|
|
31
|
+
def _query_code(self, query: dict[str, Any], baseRequest: dict[str, Any], pandasCode: str = "") -> str:
|
|
32
|
+
queryClean = {'url':query['url'],'params':query['params']} #passing only these two entries of query; params_dict is dropped.
|
|
33
|
+
queryClean['url'] = 'url'
|
|
34
|
+
queryClean['params']=queryClean['params'].replace(baseRequest['params']['api_key'],'{}')+'.format(key)' #replace explicit api key by the var "key" poiting to it.
|
|
35
|
+
|
|
36
|
+
queryCode = '''\
|
|
37
|
+
query = {}
|
|
38
|
+
retrivedData = requests.get(**query)
|
|
39
|
+
|
|
40
|
+
{} #replace json by xml if this is the request format
|
|
41
|
+
'''
|
|
42
|
+
|
|
43
|
+
queryCode = dedent(queryCode).format(json.dumps(queryClean),pandasCode)
|
|
44
|
+
queryCode = queryCode.replace('"url": "url"', '"url": url')
|
|
45
|
+
queryCode = queryCode.replace('.format(key)"', '".format(key)')
|
|
46
|
+
queryCode = queryCode.replace('"UserID": "key"', '"UserID": key') #TODO: need to handle generic case, UserID, api_key...
|
|
47
|
+
return(queryCode)
|
|
48
|
+
|
|
49
|
+
def _api_code(self, query: dict[str, Any], userSettings: dict[str, Any]) -> str:
|
|
50
|
+
r'''
|
|
51
|
+
The base format of a code that can be used to replicate a driver using Requests directly.
|
|
52
|
+
'''
|
|
53
|
+
try:
|
|
54
|
+
url = query['url']
|
|
55
|
+
apiKeyPath = userSettings['ApiKeysPath']
|
|
56
|
+
apiKeyLabel = userSettings["ApiKeyLabel"]
|
|
57
|
+
except (KeyError, AttributeError, TypeError) as e:
|
|
58
|
+
logger.debug('Incomplete connection information for code snippet: %s', e)
|
|
59
|
+
url = " incomplete connection information "
|
|
60
|
+
apiKeyPath = " incomplete connection information "
|
|
61
|
+
apiKeyLabel = ""
|
|
62
|
+
|
|
63
|
+
storagePref = apiKeyPath.split('.')[-1]
|
|
64
|
+
|
|
65
|
+
passToCode = {'ApiKeyLabel': apiKeyLabel, "url":url, 'ApiKeysPath':apiKeyPath}
|
|
66
|
+
|
|
67
|
+
code = self._api_code_options(storagePref)
|
|
68
|
+
code = code.format(**passToCode)
|
|
69
|
+
|
|
70
|
+
return(code)
|
|
71
|
+
|
|
72
|
+
def _api_code_options(self, storagePref: str) -> str:
|
|
73
|
+
r''''
|
|
74
|
+
storagePref: yaml, json, env
|
|
75
|
+
'''
|
|
76
|
+
if storagePref == 'yaml':
|
|
77
|
+
code = '''\
|
|
78
|
+
import requests
|
|
79
|
+
import yaml
|
|
80
|
+
import pandas as pd
|
|
81
|
+
|
|
82
|
+
apiKeysFile = '{ApiKeysPath}'
|
|
83
|
+
with open(apiKeysFile, 'r') as stream:
|
|
84
|
+
apiInfo= yaml.safe_load(stream)
|
|
85
|
+
url,key = apiInfo['{ApiKeyLabel}']['url'], apiInfo['{ApiKeyLabel}']['key']
|
|
86
|
+
'''
|
|
87
|
+
elif storagePref == 'json':
|
|
88
|
+
code = '''\
|
|
89
|
+
import requests
|
|
90
|
+
import json
|
|
91
|
+
import pandas as pd
|
|
92
|
+
|
|
93
|
+
# json file should contain: {"BEA":{"key":"YOUR KEY","url": "{url}" }
|
|
94
|
+
|
|
95
|
+
apiKeysFile = '{ApiKeysPath}'
|
|
96
|
+
with open(apiKeysFile) as jsonFile:
|
|
97
|
+
apiInfo = json.load(jsonFile)
|
|
98
|
+
url,key = apiInfo['{ApiKeyLabel}']['url'], apiInfo['{ApiKeyLabel}']['key']
|
|
99
|
+
'''
|
|
100
|
+
else: #default to env
|
|
101
|
+
code = '''\
|
|
102
|
+
import requests
|
|
103
|
+
import os
|
|
104
|
+
import pandas as pd
|
|
105
|
+
|
|
106
|
+
url = "{url}"
|
|
107
|
+
key = os.getenv("{ApiKeyLabel}")
|
|
108
|
+
'''
|
|
109
|
+
return(dedent(code))
|
|
File without changes
|