gooddata-pandas 1.53.0__tar.gz → 1.53.1.dev1__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.
Potentially problematic release.
This version of gooddata-pandas might be problematic. Click here for more details.
- gooddata_pandas-1.53.1.dev1/.gitignore +67 -0
- gooddata_pandas-1.53.1.dev1/.readthedocs.yaml +19 -0
- gooddata_pandas-1.53.1.dev1/Makefile +6 -0
- {gooddata_pandas-1.53.0/gooddata_pandas.egg-info → gooddata_pandas-1.53.1.dev1}/PKG-INFO +8 -21
- gooddata_pandas-1.53.1.dev1/docs/_static/empty_file +1 -0
- gooddata_pandas-1.53.1.dev1/docs/_templates/class-template.rst +32 -0
- gooddata_pandas-1.53.1.dev1/docs/_templates/module-template.rst +66 -0
- gooddata_pandas-1.53.1.dev1/docs/api.rst +9 -0
- gooddata_pandas-1.53.1.dev1/docs/conf.py +70 -0
- gooddata_pandas-1.53.1.dev1/docs/examples.rst +111 -0
- gooddata_pandas-1.53.1.dev1/docs/index.rst +13 -0
- gooddata_pandas-1.53.1.dev1/docs/installation.rst +17 -0
- gooddata_pandas-1.53.1.dev1/docs/requirements.txt +7 -0
- gooddata_pandas-1.53.1.dev1/mypy.ini +17 -0
- gooddata_pandas-1.53.1.dev1/pyproject.toml +79 -0
- gooddata_pandas-1.53.1.dev1/tests/__init__.py +51 -0
- gooddata_pandas-1.53.1.dev1/tests/conftest.py +24 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/__init__.py +1 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/conftest.py +9 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_created_visualization.yaml +2500 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_bytes_limits_failure.yaml +1171 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_dimensions_limits_failure.yaml +1171 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim1.yaml +9448 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim2.yaml +10016 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_totals1.yaml +3521 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_totals2.yaml +5625 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_totals3.yaml +3521 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_totals4.yaml +5625 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim1.yaml +3145 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim2.yaml +4936 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim3.yaml +3062 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_items.yaml +576 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_items_no_index.yaml +576 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_visualization.yaml +919 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_visualization_date.yaml +640 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/dataframe_for_visualization_no_index.yaml +919 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/empty_indexed_dataframe.yaml +360 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/empty_not_indexed_dataframe.yaml +360 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/filtered_empty_df.yaml +198 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label.yaml +565 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label_reuse.yaml +481 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/multi_index_metrics.yaml +577 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/multi_index_metrics_and_label.yaml +2521 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/not_indexed_filtered_metrics_and_labels.yaml +377 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/not_indexed_metrics.yaml +208 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/not_indexed_metrics_and_labels.yaml +389 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/simple_index_filtered_metrics_and_label.yaml +484 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/simple_index_metrics.yaml +545 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/simple_index_metrics_and_label.yaml +387 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/fixtures/simple_index_metrics_no_duplicate.yaml +387 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/analytical_dashboards/b2f2d436-9831-4fe0-81df-8c59fd33242b.yaml +194 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/filter_contexts/4717b786-2c2e-4596-adb5-4f8b0ab0e19a.yaml +22 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/filter_contexts/9f2b1f37-befa-450e-a6cc-dc576845c412.yaml +12 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/amount_of_active_customers.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/amount_of_orders.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/amount_of_top_customers.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/amount_of_valid_orders.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/campaign_spend.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/order_amount.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue_from_top_10_customers.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue_from_top_10_percent_customers.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue_from_top_10_percent_products.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue_from_top_10_products.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue_in_category.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/percent_revenue_per_product.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue-clothing.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue-electronic.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue-home.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue-outdoor.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue.yaml +8 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue_per_customer.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue_per_dollar_spent.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue_top_10.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/revenue_top_10_percent.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/total_revenue-no_filters.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/metrics/total_revenue.yaml +7 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/campaign_spend.yaml +62 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/customers_trend.yaml +74 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/percent_revenue_per_product_by_customer_and_category.yaml +77 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/percentage_of_customers_by_region.yaml +57 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/product_breakdown.yaml +55 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/product_categories_pie_chart.yaml +50 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/product_revenue_comparison-over_previous_period.yaml +73 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/product_saleability.yaml +55 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/revenue_and_quantity_by_product_and_category.yaml +97 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/revenue_by_category_trend.yaml +54 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/revenue_by_product.yaml +37 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/revenue_per_usd_vs_spend_by_campaign.yaml +54 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/revenue_trend.yaml +66 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/top_10_customers.yaml +55 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/analytics_model/visualization_objects/top_10_products.yaml +55 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/ldm/datasets/campaign_channels.yaml +67 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/ldm/datasets/campaigns.yaml +35 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/ldm/datasets/customers.yaml +58 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/ldm/datasets/order_lines.yaml +108 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/ldm/datasets/products.yaml +43 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/load/ai/ldm/date_instances/date.yaml +15 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/test_dataframe_for_created_visualization.py +66 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/test_dataframe_for_exec_def.py +436 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/test_dataframe_for_insight.py +51 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/test_dataframe_for_items.py +47 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/test_indexed_dataframe.py +213 -0
- gooddata_pandas-1.53.1.dev1/tests/dataframe/test_not_indexed_dataframe.py +91 -0
- gooddata_pandas-1.53.1.dev1/tests/gd_test_config.yaml +6 -0
- gooddata_pandas-1.53.1.dev1/tests/good_pandas/__init__.py +1 -0
- gooddata_pandas-1.53.1.dev1/tests/good_pandas/profiles/profiles.yaml +34 -0
- gooddata_pandas-1.53.1.dev1/tests/good_pandas/test_good_pandas.py +47 -0
- gooddata_pandas-1.53.1.dev1/tests/overview.md +6 -0
- gooddata_pandas-1.53.1.dev1/tests/series/__init__.py +1 -0
- gooddata_pandas-1.53.1.dev1/tests/series/conftest.py +9 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/multi_index_filtered_series.yaml +469 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/multi_index_metric_series.yaml +545 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/not_indexed_filtered_metric_series.yaml +388 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/not_indexed_label_series.yaml +340 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/not_indexed_label_series_with_granularity.yaml +504 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/not_indexed_metric_series.yaml +192 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/not_indexed_metric_series_with_granularity.yaml +369 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/simple_index_filtered_series.yaml +424 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/simple_index_label_series.yaml +340 -0
- gooddata_pandas-1.53.1.dev1/tests/series/fixtures/simple_index_metric_series.yaml +369 -0
- gooddata_pandas-1.53.1.dev1/tests/series/test_indexed_series.py +85 -0
- gooddata_pandas-1.53.1.dev1/tests/series/test_not_indexed_series.py +69 -0
- gooddata_pandas-1.53.1.dev1/tests/utils/__init__.py +1 -0
- gooddata_pandas-1.53.1.dev1/tests/utils/fixtures/test_get_catalog_attributes_for_extract.yaml +260 -0
- gooddata_pandas-1.53.1.dev1/tests/utils/test_utils.py +24 -0
- gooddata_pandas-1.53.1.dev1/tox.ini +34 -0
- gooddata_pandas-1.53.0/PKG-INFO +0 -93
- gooddata_pandas-1.53.0/gooddata_pandas.egg-info/SOURCES.txt +0 -18
- gooddata_pandas-1.53.0/gooddata_pandas.egg-info/dependency_links.txt +0 -1
- gooddata_pandas-1.53.0/gooddata_pandas.egg-info/requires.txt +0 -2
- gooddata_pandas-1.53.0/gooddata_pandas.egg-info/top_level.txt +0 -1
- gooddata_pandas-1.53.0/setup.cfg +0 -4
- gooddata_pandas-1.53.0/setup.py +0 -65
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1}/LICENSE.txt +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1}/MANIFEST.in +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1}/README.md +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/__init__.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/_version.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/data_access.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/dataframe.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/good_pandas.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/py.typed +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/result_convertor.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/series.py +0 -0
- {gooddata_pandas-1.53.0 → gooddata_pandas-1.53.1.dev1/src}/gooddata_pandas/utils.py +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
env/
|
|
12
|
+
build/
|
|
13
|
+
develop-eggs/
|
|
14
|
+
dist/
|
|
15
|
+
downloads/
|
|
16
|
+
eggs/
|
|
17
|
+
.eggs/
|
|
18
|
+
lib/
|
|
19
|
+
lib64/
|
|
20
|
+
parts/
|
|
21
|
+
sdist/
|
|
22
|
+
var/
|
|
23
|
+
*.egg-info/
|
|
24
|
+
.installed.cfg
|
|
25
|
+
*.egg
|
|
26
|
+
|
|
27
|
+
# PyInstaller
|
|
28
|
+
# Usually these files are written by a python script from a template
|
|
29
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
30
|
+
*.manifest
|
|
31
|
+
*.spec
|
|
32
|
+
|
|
33
|
+
# Installer logs
|
|
34
|
+
pip-log.txt
|
|
35
|
+
pip-delete-this-directory.txt
|
|
36
|
+
|
|
37
|
+
# Unit test / coverage reports
|
|
38
|
+
htmlcov/
|
|
39
|
+
.tox/
|
|
40
|
+
.coverage
|
|
41
|
+
.coverage.*
|
|
42
|
+
.cache
|
|
43
|
+
nosetests.xml
|
|
44
|
+
coverage.xml
|
|
45
|
+
*,cover
|
|
46
|
+
.hypothesis/
|
|
47
|
+
venv/
|
|
48
|
+
.venv/
|
|
49
|
+
.python-version
|
|
50
|
+
.pytest_cache
|
|
51
|
+
|
|
52
|
+
# Translations
|
|
53
|
+
*.mo
|
|
54
|
+
*.pot
|
|
55
|
+
|
|
56
|
+
# Django stuff:
|
|
57
|
+
*.log
|
|
58
|
+
|
|
59
|
+
# Sphinx documentation
|
|
60
|
+
docs/_build/
|
|
61
|
+
docs/_autosummary/
|
|
62
|
+
|
|
63
|
+
# PyBuilder
|
|
64
|
+
target/
|
|
65
|
+
|
|
66
|
+
#Ipython Notebook
|
|
67
|
+
.ipynb_checkpoints
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# (C) 2023 GoodData Corporation
|
|
2
|
+
# Read the Docs configuration file for Sphinx projects
|
|
3
|
+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
4
|
+
|
|
5
|
+
# Required
|
|
6
|
+
version: 2
|
|
7
|
+
|
|
8
|
+
# Set the OS, Python version and other tools you might need
|
|
9
|
+
build:
|
|
10
|
+
os: ubuntu-22.04
|
|
11
|
+
tools:
|
|
12
|
+
python: "3.13"
|
|
13
|
+
|
|
14
|
+
sphinx:
|
|
15
|
+
configuration: gooddata-pandas/docs/conf.py
|
|
16
|
+
|
|
17
|
+
python:
|
|
18
|
+
install:
|
|
19
|
+
- requirements: gooddata-pandas/docs/requirements.txt
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gooddata-pandas
|
|
3
|
-
Version: 1.53.
|
|
3
|
+
Version: 1.53.1.dev1
|
|
4
4
|
Summary: GoodData Cloud to pandas
|
|
5
|
-
|
|
6
|
-
Author-email: support@gooddata.com
|
|
7
|
-
License: MIT
|
|
8
|
-
Project-URL: Documentation, https://gooddata-pandas.readthedocs.io/en/v1.53.0
|
|
5
|
+
Project-URL: Documentation, https://gooddata-pandas.readthedocs.io/en/v1.53.1.dev1
|
|
9
6
|
Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
|
|
10
|
-
|
|
7
|
+
Author-email: GoodData <support@gooddata.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
License-File: LICENSE.txt
|
|
10
|
+
Keywords: analytics,business,cloud,data,data_frame,frame,gooddata,headless,headless-bi,intelligence,layer,metrics,native,pandas,semantic,series,sql
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Environment :: Console
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -21,22 +21,9 @@ Classifier: Topic :: Scientific/Engineering
|
|
|
21
21
|
Classifier: Topic :: Software Development
|
|
22
22
|
Classifier: Typing :: Typed
|
|
23
23
|
Requires-Python: >=3.9.0
|
|
24
|
-
|
|
25
|
-
License-File: LICENSE.txt
|
|
26
|
-
Requires-Dist: gooddata-sdk~=1.53.0
|
|
24
|
+
Requires-Dist: gooddata-sdk~=1.53.1.dev1
|
|
27
25
|
Requires-Dist: pandas<3.0.0,>=2.0.0
|
|
28
|
-
|
|
29
|
-
Dynamic: author-email
|
|
30
|
-
Dynamic: classifier
|
|
31
|
-
Dynamic: description
|
|
32
|
-
Dynamic: description-content-type
|
|
33
|
-
Dynamic: keywords
|
|
34
|
-
Dynamic: license
|
|
35
|
-
Dynamic: license-file
|
|
36
|
-
Dynamic: project-url
|
|
37
|
-
Dynamic: requires-dist
|
|
38
|
-
Dynamic: requires-python
|
|
39
|
-
Dynamic: summary
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
40
27
|
|
|
41
28
|
# GoodData Pandas
|
|
42
29
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# (C) 2022 GoodData Corporation
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{{ fullname | escape | underline}}
|
|
2
|
+
|
|
3
|
+
.. currentmodule:: {{ module }}
|
|
4
|
+
|
|
5
|
+
.. autoclass:: {{ objname }}
|
|
6
|
+
:members:
|
|
7
|
+
:show-inheritance:
|
|
8
|
+
:inherited-members:
|
|
9
|
+
|
|
10
|
+
{% block methods %}
|
|
11
|
+
.. automethod:: __init__
|
|
12
|
+
|
|
13
|
+
{% if methods %}
|
|
14
|
+
.. rubric:: {{ _('Methods') }}
|
|
15
|
+
|
|
16
|
+
.. autosummary::
|
|
17
|
+
{% for item in methods %}
|
|
18
|
+
~{{ name }}.{{ item }}
|
|
19
|
+
{%- endfor %}
|
|
20
|
+
{% endif %}
|
|
21
|
+
{% endblock %}
|
|
22
|
+
|
|
23
|
+
{% block attributes %}
|
|
24
|
+
{% if attributes %}
|
|
25
|
+
.. rubric:: {{ _('Attributes') }}
|
|
26
|
+
|
|
27
|
+
.. autosummary::
|
|
28
|
+
{% for item in attributes %}
|
|
29
|
+
~{{ name }}.{{ item }}
|
|
30
|
+
{%- endfor %}
|
|
31
|
+
{% endif %}
|
|
32
|
+
{% endblock %}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{{ fullname | escape | underline}}
|
|
2
|
+
|
|
3
|
+
.. automodule:: {{ fullname }}
|
|
4
|
+
|
|
5
|
+
{% block attributes %}
|
|
6
|
+
{% if attributes %}
|
|
7
|
+
.. rubric:: Module Attributes
|
|
8
|
+
|
|
9
|
+
.. autosummary::
|
|
10
|
+
:toctree:
|
|
11
|
+
{% for item in attributes %}
|
|
12
|
+
{{ item }}
|
|
13
|
+
{%- endfor %}
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% endblock %}
|
|
16
|
+
|
|
17
|
+
{% block functions %}
|
|
18
|
+
{% if functions %}
|
|
19
|
+
.. rubric:: {{ _('Functions') }}
|
|
20
|
+
|
|
21
|
+
.. autosummary::
|
|
22
|
+
:toctree:
|
|
23
|
+
{% for item in functions %}
|
|
24
|
+
{{ item }}
|
|
25
|
+
{%- endfor %}
|
|
26
|
+
{% endif %}
|
|
27
|
+
{% endblock %}
|
|
28
|
+
|
|
29
|
+
{% block classes %}
|
|
30
|
+
{% if classes %}
|
|
31
|
+
.. rubric:: {{ _('Classes') }}
|
|
32
|
+
|
|
33
|
+
.. autosummary::
|
|
34
|
+
:toctree:
|
|
35
|
+
:template: class-template.rst
|
|
36
|
+
{% for item in classes %}
|
|
37
|
+
{{ item }}
|
|
38
|
+
{%- endfor %}
|
|
39
|
+
{% endif %}
|
|
40
|
+
{% endblock %}
|
|
41
|
+
|
|
42
|
+
{% block exceptions %}
|
|
43
|
+
{% if exceptions %}
|
|
44
|
+
.. rubric:: {{ _('Exceptions') }}
|
|
45
|
+
|
|
46
|
+
.. autosummary::
|
|
47
|
+
:toctree:
|
|
48
|
+
{% for item in exceptions %}
|
|
49
|
+
{{ item }}
|
|
50
|
+
{%- endfor %}
|
|
51
|
+
{% endif %}
|
|
52
|
+
{% endblock %}
|
|
53
|
+
|
|
54
|
+
{% block modules %}
|
|
55
|
+
{% if modules %}
|
|
56
|
+
.. rubric:: Modules
|
|
57
|
+
|
|
58
|
+
.. autosummary::
|
|
59
|
+
:toctree:
|
|
60
|
+
:template: module-template.rst
|
|
61
|
+
:recursive:
|
|
62
|
+
{% for item in modules %}
|
|
63
|
+
{{ item }}
|
|
64
|
+
{%- endfor %}
|
|
65
|
+
{% endif %}
|
|
66
|
+
{% endblock %}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# (C) 2022 GoodData Corporation
|
|
2
|
+
# Configuration file for the Sphinx documentation builder.
|
|
3
|
+
#
|
|
4
|
+
# This file only contains a selection of the most common options. For a full
|
|
5
|
+
# list see the documentation:
|
|
6
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
|
7
|
+
|
|
8
|
+
# -- Path setup --------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
# If extensions (or modules to document with autodoc) are in another directory,
|
|
11
|
+
# add these directories to sys.path here. If the directory is relative to the
|
|
12
|
+
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
13
|
+
#
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
|
|
17
|
+
import gooddata_pandas
|
|
18
|
+
|
|
19
|
+
sys.path.insert(0, os.path.abspath(".."))
|
|
20
|
+
print(f"sys.path = {sys.path}")
|
|
21
|
+
print(f"os.getcwd() = {os.getcwd()}")
|
|
22
|
+
|
|
23
|
+
project = "GoodData Pandas"
|
|
24
|
+
copyright = "2021-2022, GoodData Corporation"
|
|
25
|
+
author = "GoodData Corporation"
|
|
26
|
+
|
|
27
|
+
# The full version, including alpha/beta/rc tags
|
|
28
|
+
release = gooddata_pandas.__version__
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# -- General configuration ---------------------------------------------------
|
|
32
|
+
|
|
33
|
+
# Add any Sphinx extension module names here, as strings. They can be
|
|
34
|
+
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
35
|
+
# ones.
|
|
36
|
+
extensions = [
|
|
37
|
+
"pallets_sphinx_themes",
|
|
38
|
+
"sphinx.ext.autodoc",
|
|
39
|
+
"sphinx.ext.autosummary",
|
|
40
|
+
"sphinx.ext.intersphinx",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
# Add any paths that contain templates here, relative to this directory.
|
|
44
|
+
templates_path = ["_templates"]
|
|
45
|
+
|
|
46
|
+
# List of patterns, relative to source directory, that match files and
|
|
47
|
+
# directories to ignore when looking for source files.
|
|
48
|
+
# This pattern also affects html_static_path and html_extra_path.
|
|
49
|
+
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# -- Options for HTML output -------------------------------------------------
|
|
53
|
+
|
|
54
|
+
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
55
|
+
# a list of builtin themes.
|
|
56
|
+
#
|
|
57
|
+
html_theme = "sphinx_rtd_theme"
|
|
58
|
+
|
|
59
|
+
# Add any paths that contain custom static files (such as style sheets) here,
|
|
60
|
+
# relative to this directory. They are copied after the builtin static files,
|
|
61
|
+
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
62
|
+
html_static_path = ["_static"]
|
|
63
|
+
|
|
64
|
+
source_suffix = {
|
|
65
|
+
".rst": "restructuredtext",
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# intersphinx_mapping = {
|
|
69
|
+
# "gooddata_sdk": ("", None)
|
|
70
|
+
# }
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
|
|
2
|
+
Examples
|
|
3
|
+
********
|
|
4
|
+
|
|
5
|
+
Here are a couple of introductory examples how to create indexed and not-indexed series and data frames:
|
|
6
|
+
|
|
7
|
+
Series
|
|
8
|
+
======
|
|
9
|
+
|
|
10
|
+
.. code-block:: python
|
|
11
|
+
|
|
12
|
+
from gooddata_pandas import GoodPandas
|
|
13
|
+
|
|
14
|
+
# GoodData.CN host in the form of uri eg. "http://localhost:3000"
|
|
15
|
+
host = "http://localhost:3000"
|
|
16
|
+
# GoodData.CN user token
|
|
17
|
+
token = "some_user_token"
|
|
18
|
+
# initialize the adapter to work on top of GD.CN host and use the provided authentication token
|
|
19
|
+
gp = GoodPandas(host, token)
|
|
20
|
+
|
|
21
|
+
workspace_id = "demo"
|
|
22
|
+
series = gp.series(workspace_id)
|
|
23
|
+
|
|
24
|
+
# create indexed series
|
|
25
|
+
indexed_series = series.indexed(index_by="label/label_id", data_by="fact/measure_id")
|
|
26
|
+
|
|
27
|
+
# create non-indexed series containing just the values of measure sliced by elements of the label
|
|
28
|
+
non_indexed = series.not_indexed(data_by="fact/measure_id", granularity="label/label_id")
|
|
29
|
+
|
|
30
|
+
Data Frames
|
|
31
|
+
===========
|
|
32
|
+
|
|
33
|
+
.. code-block:: python
|
|
34
|
+
|
|
35
|
+
from gooddata_pandas import GoodPandas
|
|
36
|
+
|
|
37
|
+
# GoodData.CN host in the form of uri eg. "http://localhost:3000"
|
|
38
|
+
host = "http://localhost:3000"
|
|
39
|
+
# GoodData.CN user token
|
|
40
|
+
token = "some_user_token"
|
|
41
|
+
# initialize the adapter to work on top of GD.CN host and use the provided authentication token
|
|
42
|
+
gp = GoodPandas(host, token)
|
|
43
|
+
|
|
44
|
+
workspace_id = "demo"
|
|
45
|
+
frames = gp.data_frames(workspace_id)
|
|
46
|
+
|
|
47
|
+
# create indexed data frame
|
|
48
|
+
indexed_df = frames.indexed(
|
|
49
|
+
index_by="label/label_id",
|
|
50
|
+
columns=dict(
|
|
51
|
+
first_label='label/first_label_id',
|
|
52
|
+
second_label='label/second_label_id',
|
|
53
|
+
first_metric='metric/first_metric_id',
|
|
54
|
+
second_metric='fact/fact_id'
|
|
55
|
+
)
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# create data frame with hierarchical index
|
|
59
|
+
indexed_df = frames.indexed(
|
|
60
|
+
index_by=dict(first_label='label/first_label_id', second_label='label/second_label_id'),
|
|
61
|
+
columns=dict(first_metric='metric/first_metric_id', second_metric='fact/fact_id')
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# create non-indexed data frame
|
|
65
|
+
non_indexed_df = frames.not_indexed(
|
|
66
|
+
columns=dict(
|
|
67
|
+
first_label='label/first_label_id',
|
|
68
|
+
second_label='label/second_label_id',
|
|
69
|
+
first_metric='metric/first_metric_id',
|
|
70
|
+
second_metric='fact/fact_id'
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# create data frame based on the contents of the visualization. if the visualization contains labels and
|
|
75
|
+
# measures, the data frame will contain index or hierarchical index.
|
|
76
|
+
visualization_df = frames.for_visualization('visualization_id')
|
|
77
|
+
|
|
78
|
+
# create data frame based on the content of the items dict. if the dict contains both labels
|
|
79
|
+
# and measures, the frame will contain index or hierarchical index.
|
|
80
|
+
df = frames.for_items(
|
|
81
|
+
items=dict(
|
|
82
|
+
first_label='label/first_label_id',
|
|
83
|
+
second_label='label/second_label_id',
|
|
84
|
+
first_metric='metric/first_metric_id',
|
|
85
|
+
second_metric='fact/fact_id'
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# create data frame from custom execution definition
|
|
90
|
+
exec_def = ExecutionDefinition(
|
|
91
|
+
attributes=[
|
|
92
|
+
Attribute(local_id="region", label="region"),
|
|
93
|
+
Attribute(local_id="state", label="state"),
|
|
94
|
+
Attribute(local_id="product_category", label="products.category"),
|
|
95
|
+
],
|
|
96
|
+
metrics=[
|
|
97
|
+
SimpleMetric(local_id="price", item=ObjId(id="price", type="fact")),
|
|
98
|
+
SimpleMetric(local_id="order_amount", item=ObjId(id="order_amount", type="metric")),
|
|
99
|
+
],
|
|
100
|
+
filters=[],
|
|
101
|
+
dimensions=[
|
|
102
|
+
TableDimension(item_ids=["state", "region"]),
|
|
103
|
+
TableDimension(item_ids=["product_category", "measureGroup"]),
|
|
104
|
+
],
|
|
105
|
+
)
|
|
106
|
+
df, df_metadata = frames.for_exec_def(exec_def=exec_def)
|
|
107
|
+
|
|
108
|
+
# use result ID from computation above and generate dataframe just from it
|
|
109
|
+
df_from_result_id, df_metadata_from_result_id = frames.for_exec_result_id(
|
|
110
|
+
result_id=df_metadata.execution_response.result_id,
|
|
111
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
GoodData Pandas Documentation
|
|
2
|
+
*****************************
|
|
3
|
+
|
|
4
|
+
GoodData Pandas contains a thin layer that utilizes GoodData Python SDK and allows you to conveniently create pandas series and
|
|
5
|
+
data frames from the computations done against semantic model in your GoodData.CN workspace.
|
|
6
|
+
|
|
7
|
+
.. toctree::
|
|
8
|
+
:maxdepth: 2
|
|
9
|
+
:caption: Contents:
|
|
10
|
+
|
|
11
|
+
installation
|
|
12
|
+
examples
|
|
13
|
+
api
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Installation
|
|
2
|
+
************
|
|
3
|
+
|
|
4
|
+
Requirements
|
|
5
|
+
=============
|
|
6
|
+
|
|
7
|
+
- Python 3.7 or newer
|
|
8
|
+
- GoodData.CN or GoodData Cloud
|
|
9
|
+
|
|
10
|
+
Installation
|
|
11
|
+
============
|
|
12
|
+
|
|
13
|
+
Run the following command to install the ``gooddata-pandas`` package on your system:
|
|
14
|
+
|
|
15
|
+
.. code-block:: shell
|
|
16
|
+
|
|
17
|
+
pip install gooddata-pandas
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# (C) 2021 GoodData Corporation
|
|
2
|
+
[mypy]
|
|
3
|
+
plugins = pydantic.mypy
|
|
4
|
+
disallow_untyped_defs = True
|
|
5
|
+
warn_redundant_casts = True
|
|
6
|
+
strict_equality = True
|
|
7
|
+
no_implicit_optional = True
|
|
8
|
+
python_version = 3.9
|
|
9
|
+
|
|
10
|
+
[mypy-gooddata_api_client.*]
|
|
11
|
+
ignore_missing_imports = True
|
|
12
|
+
|
|
13
|
+
[mypy-gooddata_sdk.*]
|
|
14
|
+
ignore_missing_imports = True
|
|
15
|
+
|
|
16
|
+
[mypy-pandas.*]
|
|
17
|
+
ignore_missing_imports = True
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# (C) 2025 GoodData Corporation
|
|
2
|
+
[project]
|
|
3
|
+
name = "gooddata-pandas"
|
|
4
|
+
version = "1.53.1.dev1"
|
|
5
|
+
description = "GoodData Cloud to pandas"
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
license = {text = "MIT"}
|
|
8
|
+
authors = [
|
|
9
|
+
{name = "GoodData", email = "support@gooddata.com"}
|
|
10
|
+
]
|
|
11
|
+
keywords = [
|
|
12
|
+
"gooddata",
|
|
13
|
+
"pandas",
|
|
14
|
+
"series",
|
|
15
|
+
"data",
|
|
16
|
+
"frame",
|
|
17
|
+
"data_frame",
|
|
18
|
+
"analytics",
|
|
19
|
+
"headless",
|
|
20
|
+
"business",
|
|
21
|
+
"intelligence",
|
|
22
|
+
"headless-bi",
|
|
23
|
+
"cloud",
|
|
24
|
+
"native",
|
|
25
|
+
"semantic",
|
|
26
|
+
"layer",
|
|
27
|
+
"sql",
|
|
28
|
+
"metrics",
|
|
29
|
+
]
|
|
30
|
+
requires-python = ">=3.9.0"
|
|
31
|
+
dependencies = [
|
|
32
|
+
"gooddata-sdk~=1.53.1.dev1",
|
|
33
|
+
"pandas>=2.0.0,<3.0.0",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
classifiers = [
|
|
37
|
+
"Development Status :: 5 - Production/Stable",
|
|
38
|
+
"Environment :: Console",
|
|
39
|
+
"License :: OSI Approved :: MIT License",
|
|
40
|
+
"Programming Language :: Python :: 3.9",
|
|
41
|
+
"Programming Language :: Python :: 3.10",
|
|
42
|
+
"Programming Language :: Python :: 3.11",
|
|
43
|
+
"Programming Language :: Python :: 3.12",
|
|
44
|
+
"Programming Language :: Python :: 3.13",
|
|
45
|
+
"Topic :: Database",
|
|
46
|
+
"Topic :: Scientific/Engineering",
|
|
47
|
+
"Topic :: Software Development",
|
|
48
|
+
"Typing :: Typed",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[tool.uv.sources]
|
|
52
|
+
gooddata-sdk = { workspace = true }
|
|
53
|
+
|
|
54
|
+
[project.urls]
|
|
55
|
+
Documentation = "https://gooddata-pandas.readthedocs.io/en/v1.53.1.dev1"
|
|
56
|
+
Source = "https://github.com/gooddata/gooddata-python-sdk"
|
|
57
|
+
|
|
58
|
+
[dependency-groups]
|
|
59
|
+
test = [
|
|
60
|
+
"pytest~=8.3.4",
|
|
61
|
+
"pytest-cov~=6.0.0",
|
|
62
|
+
"pytest-snapshot==0.9.0",
|
|
63
|
+
"pytest-order~=1.3.0",
|
|
64
|
+
"vcrpy~=7.0.0",
|
|
65
|
+
"urllib3==1.26.9",
|
|
66
|
+
"python-dotenv~=1.0.0",
|
|
67
|
+
"pyyaml"
|
|
68
|
+
]
|
|
69
|
+
type = [
|
|
70
|
+
"mypy~=1.11.2",
|
|
71
|
+
"pydantic~=2.9.2"
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
[tool.hatch.build.targets.wheel]
|
|
75
|
+
packages = ["src/gooddata_pandas"]
|
|
76
|
+
|
|
77
|
+
[build-system]
|
|
78
|
+
requires = ["hatchling"]
|
|
79
|
+
build-backend = "hatchling.build"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# (C) 2021 GoodData Corporation
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dotenv import dotenv_values, find_dotenv
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _load_test_env():
|
|
8
|
+
try:
|
|
9
|
+
test_env = find_dotenv(".env.test", raise_error_if_not_found=True)
|
|
10
|
+
|
|
11
|
+
return dotenv_values(test_env)
|
|
12
|
+
except OSError:
|
|
13
|
+
return dict()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def get_test_token():
|
|
17
|
+
config = _load_test_env()
|
|
18
|
+
|
|
19
|
+
if "TEST_TOKEN" not in config:
|
|
20
|
+
# returning bogus token so that tests that use vcr recordings have something to use
|
|
21
|
+
return "test-token-undefined"
|
|
22
|
+
|
|
23
|
+
return config["TEST_TOKEN"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
TEST_DATA_REGIONS = [
|
|
27
|
+
"Aargau",
|
|
28
|
+
"Basel-Landschaft",
|
|
29
|
+
"Basel-Stadt",
|
|
30
|
+
"Bern",
|
|
31
|
+
"Fribourg",
|
|
32
|
+
"Geneva",
|
|
33
|
+
"Glarus",
|
|
34
|
+
"Graubünden",
|
|
35
|
+
"Jura",
|
|
36
|
+
"Lucerne",
|
|
37
|
+
"Neuchâtel",
|
|
38
|
+
"Nidwalden",
|
|
39
|
+
"Obwalden",
|
|
40
|
+
"Schaffhausen",
|
|
41
|
+
"Schwyz",
|
|
42
|
+
"Solothurn",
|
|
43
|
+
"St. Gallen",
|
|
44
|
+
"Thurgau",
|
|
45
|
+
"Ticino",
|
|
46
|
+
"Uri",
|
|
47
|
+
"Valais",
|
|
48
|
+
"Vaud",
|
|
49
|
+
"Zug",
|
|
50
|
+
"Zürich",
|
|
51
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# (C) 2021 GoodData Corporation
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
import yaml
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def pytest_addoption(parser):
|
|
9
|
+
default_config_path = Path(__file__).parent / "gd_test_config.yaml"
|
|
10
|
+
parser.addoption(
|
|
11
|
+
"--gd-test-config",
|
|
12
|
+
action="store",
|
|
13
|
+
default=str(default_config_path),
|
|
14
|
+
help="Absolut path to test configuration",
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.fixture(scope="session")
|
|
19
|
+
def test_config(request):
|
|
20
|
+
config_path = Path(request.config.getoption("--gd-test-config"))
|
|
21
|
+
with open(config_path) as f:
|
|
22
|
+
config = yaml.safe_load(f)
|
|
23
|
+
|
|
24
|
+
return config
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# (C) 2021 GoodData Corporation
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# (C) 2021 GoodData Corporation
|
|
2
|
+
import pytest
|
|
3
|
+
from gooddata_pandas import DataFrameFactory, GoodPandas
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.fixture
|
|
7
|
+
def gdf(test_config) -> DataFrameFactory:
|
|
8
|
+
gdpd = GoodPandas(host=test_config["host"], token=test_config["token"])
|
|
9
|
+
return gdpd.data_frames(test_config["workspace"])
|