teehr 0.4.13__tar.gz → 0.5.1.dev10__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.
- {teehr-0.4.13 → teehr-0.5.1.dev10}/PKG-INFO +33 -29
- teehr-0.5.1.dev10/pyproject.toml +91 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/__init__.py +13 -3
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/evaluation.py +125 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/fetch.py +134 -77
- teehr-0.5.1.dev10/src/teehr/evaluation/generate.py +232 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/metrics.py +149 -31
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/attribute_table.py +2 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/base_table.py +165 -30
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/configuration_table.py +2 -1
- teehr-0.5.1.dev10/src/teehr/evaluation/tables/domain_table.py +97 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/joined_timeseries_table.py +77 -25
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/location_attribute_table.py +96 -5
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/location_crosswalk_table.py +64 -5
- teehr-0.5.1.dev10/src/teehr/evaluation/tables/location_table.py +286 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/primary_timeseries_table.py +74 -4
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/secondary_timeseries_table.py +80 -12
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/timeseries_table.py +31 -21
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/unit_table.py +2 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/variable_table.py +2 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/03-metric_queries.ipynb +1 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/const.py +8 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/grid_utils.py +5 -5
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/nwm_grids.py +81 -37
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/nwm_points.py +82 -36
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/point_utils.py +5 -6
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/retrospective_grids.py +1 -4
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/retrospective_points.py +5 -17
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/usgs/usgs.py +195 -79
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/utils.py +196 -71
- teehr-0.5.1.dev10/src/teehr/generate/utils.py +179 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/s3/clone_from_s3.py +14 -3
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/timeseries.py +17 -4
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/utils.py +72 -17
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/bootstrap_funcs.py +82 -5
- teehr-0.5.1.dev10/src/teehr/metrics/deterministic_funcs.py +661 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/probabilistic_funcs.py +38 -20
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/signature_funcs.py +86 -21
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/calculated_fields/row_level.py +99 -6
- teehr-0.5.1.dev10/src/teehr/models/calculated_fields/timeseries_aware.py +2447 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/filters.py +31 -7
- teehr-0.5.1.dev10/src/teehr/models/generate/base.py +86 -0
- teehr-0.5.1.dev10/src/teehr/models/generate/timeseries_generator_models.py +229 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/basemodels.py +1 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/deterministic_models.py +156 -40
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/metric_attributes.py +16 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/probabilistic_models.py +5 -4
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/signature_models.py +99 -18
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/pandera_dataframe_schemas.py +1 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/pydantic_table_models.py +0 -1
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/table_enums.py +15 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/filter_format.py +31 -7
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/metric_format.py +4 -8
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utilities/generate_weights.py +2 -2
- teehr-0.5.1.dev10/src/teehr/utils/remove_spark_jars.py +36 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/visualization/dataframe_accessor.py +298 -76
- teehr-0.4.13/pyproject.toml +0 -78
- teehr-0.4.13/src/teehr/evaluation/tables/domain_table.py +0 -35
- teehr-0.4.13/src/teehr/evaluation/tables/location_table.py +0 -155
- teehr-0.4.13/src/teehr/metrics/deterministic_funcs.py +0 -471
- teehr-0.4.13/src/teehr/models/calculated_fields/timeseries_aware.py +0 -200
- teehr-0.4.13/src/teehr/utils/install_spark_jars.py +0 -32
- {teehr-0.4.13 → teehr-0.5.1.dev10}/LICENSE.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/README.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/const.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/utils.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/ensemble_example_data.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/nwm_gridded_example_data.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/nwm_streamflow_example_data.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/two_locations.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/v0_3_test_study.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/01-evaluation_setup.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/02-table_queries.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/04-table_filters.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/05-2_site_setup.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/06-2_site_query.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/07-2_site_plotting.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/08-sql.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/09-ensemble_metric_queries.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/clone_from_s3.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/load_netcdf.ipynb +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/ngen_example.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/partition_by_reference_time.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_ensemble_example.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_evaluation.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_nwm_grid_example.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_nwm_streamflow_example.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/two_site_debug_script.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/usgs/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/location_attributes.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/location_crosswalks.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/locations.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/gumboot_bootstrap.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/calculated_fields/base.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm12_grid.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm12_point.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm20_grid.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm20_point.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm22_grid.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm22_point.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm30_grid.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm30_point.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/utils.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/bootstrap_models.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/str_enum.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/utils.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/cache/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/attributes/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/attributes/attributes.csv +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/configurations/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/configurations/configurations.csv +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/joined_timeseries/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/location_attributes/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/location_crosswalks/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/locations/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/primary_timeseries/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/secondary_timeseries/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/units/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/units/units.csv +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/variables/_readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/variables/variables.csv +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/gitignore_template +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/readme.md +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/scripts/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/scripts/user_defined_fields.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utilities/__init__.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utils/s3path.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utils/utils.py +0 -0
- {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/visualization/__init__.py +0 -0
|
@@ -1,42 +1,46 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: teehr
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1.dev10
|
|
4
4
|
Summary: Tools for Exploratory Evaluation in Hydrologic Research
|
|
5
5
|
License: GNU v3
|
|
6
|
+
License-File: LICENSE.md
|
|
6
7
|
Author: RTI International
|
|
7
|
-
Requires-Python: >=3.10,<
|
|
8
|
+
Requires-Python: >=3.10,<3.14
|
|
8
9
|
Classifier: License :: Other/Proprietary License
|
|
9
10
|
Classifier: Programming Language :: Python :: 3
|
|
10
11
|
Classifier: Programming Language :: Python :: 3.10
|
|
11
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
-
Requires-Dist:
|
|
15
|
-
Requires-Dist:
|
|
16
|
-
Requires-Dist:
|
|
17
|
-
Requires-Dist:
|
|
18
|
-
Requires-Dist:
|
|
19
|
-
Requires-Dist:
|
|
20
|
-
Requires-Dist:
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist: kerchunk (>=0.2.2,<
|
|
26
|
-
Requires-Dist: lxml (>=5.
|
|
27
|
-
Requires-Dist: netcdf4 (
|
|
28
|
-
Requires-Dist: numba (>=0.60.0,<
|
|
29
|
-
Requires-Dist: pandas (>=2.2.0,<3
|
|
30
|
-
Requires-Dist: pandera[pyspark] (>=0.20.4,<
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist:
|
|
34
|
-
Requires-Dist:
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist:
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
15
|
+
Requires-Dist: apache-sedona (>=1.7.0,<2)
|
|
16
|
+
Requires-Dist: arch (>=7.0.0,<8)
|
|
17
|
+
Requires-Dist: baseflow (>=0.1.0,<0.2.0)
|
|
18
|
+
Requires-Dist: bokeh (>=3.7.3,<4)
|
|
19
|
+
Requires-Dist: dask (>=2025,<2026)
|
|
20
|
+
Requires-Dist: dataretrieval (>=1.0.9,<2)
|
|
21
|
+
Requires-Dist: fsspec (>=2023.10.0,<2026)
|
|
22
|
+
Requires-Dist: gcsfs (>=2023.10.0,<2026)
|
|
23
|
+
Requires-Dist: geopandas (>=1,<2)
|
|
24
|
+
Requires-Dist: h5py (>=3.12.1,<4)
|
|
25
|
+
Requires-Dist: httpx (>=0.25.1,<1)
|
|
26
|
+
Requires-Dist: kerchunk (>=0.2.2,<1)
|
|
27
|
+
Requires-Dist: lxml (>=5.4.0,<6)
|
|
28
|
+
Requires-Dist: netcdf4 (>=1.6.5,<2)
|
|
29
|
+
Requires-Dist: numba (>=0.60.0,<1)
|
|
30
|
+
Requires-Dist: pandas (>=2.2.0,<3)
|
|
31
|
+
Requires-Dist: pandera[pyspark] (>=0.20.4,<1)
|
|
32
|
+
Requires-Dist: protobuf (==5.28.3)
|
|
33
|
+
Requires-Dist: psutil (>=7.0.0,<8)
|
|
34
|
+
Requires-Dist: pyarrow (>=15.0.0,<21)
|
|
35
|
+
Requires-Dist: pydantic (>=2.4.2,<3)
|
|
36
|
+
Requires-Dist: pyiceberg (>=0.9.1,<1)
|
|
37
|
+
Requires-Dist: pyspark[pandas-on-spark] (>=4,<5)
|
|
38
|
+
Requires-Dist: rasterio (>=1.3.0,<2)
|
|
39
|
+
Requires-Dist: rioxarray (>=0.15.0,<1)
|
|
40
|
+
Requires-Dist: s3fs (>=2023.10.0,<2026)
|
|
41
|
+
Requires-Dist: scoringrules (>=0.7.1,<1)
|
|
42
|
+
Requires-Dist: ujson (>=5.8.0,<6)
|
|
43
|
+
Requires-Dist: zarr (>=2.16.1,<3)
|
|
40
44
|
Description-Content-Type: text/markdown
|
|
41
45
|
|
|
42
46
|

|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "teehr"
|
|
3
|
+
version = "0.5.1dev10"
|
|
4
|
+
description = "Tools for Exploratory Evaluation in Hydrologic Research"
|
|
5
|
+
authors = [
|
|
6
|
+
"RTI International",
|
|
7
|
+
"Matthew Denno <mdenno@rti.org>",
|
|
8
|
+
"Katie van Werkhoven <kvanwerkhoven@rti.org>",
|
|
9
|
+
"Sam Lamont <slamont@rti.org>",
|
|
10
|
+
"Sam Landsteiner <slandsteiner@rti.org>",
|
|
11
|
+
]
|
|
12
|
+
license = "GNU v3"
|
|
13
|
+
readme = "README.md"
|
|
14
|
+
|
|
15
|
+
[tool.poetry.dependencies]
|
|
16
|
+
python = ">=3.10,<3.14"
|
|
17
|
+
geopandas = ">=1,<2"
|
|
18
|
+
pydantic = ">=2.4.2,<3"
|
|
19
|
+
dask = ">=2025,<2026"
|
|
20
|
+
fsspec = ">=2023.10.0,<2026"
|
|
21
|
+
ujson = ">=5.8.0,<6"
|
|
22
|
+
kerchunk = ">=0.2.2,<1"
|
|
23
|
+
gcsfs = ">=2023.10.0,<2026"
|
|
24
|
+
s3fs = ">=2023.10.0,<2026"
|
|
25
|
+
zarr = ">=2.16.1,<3"
|
|
26
|
+
rioxarray = ">=0.15.0,<1"
|
|
27
|
+
rasterio = ">=1.3.0,<2"
|
|
28
|
+
h5py = ">=3.12.1,<4"
|
|
29
|
+
pyarrow = ">=15.0.0,<21"
|
|
30
|
+
httpx = ">=0.25.1,<1"
|
|
31
|
+
pandas = ">=2.2.0,<3"
|
|
32
|
+
pyspark = {extras = ["pandas-on-spark"], version = ">=4,<5"}
|
|
33
|
+
dataretrieval = ">=1.0.9,<2"
|
|
34
|
+
numba = ">=0.60.0,<1"
|
|
35
|
+
arch = ">=7.0.0,<8"
|
|
36
|
+
pandera = {extras = ["pyspark"], version = ">=0.20.4,<1"}
|
|
37
|
+
netcdf4 = ">=1.6.5,<2"
|
|
38
|
+
apache-sedona = ">=1.7.0,<2"
|
|
39
|
+
scoringrules = ">=0.7.1,<1"
|
|
40
|
+
pyiceberg = ">=0.9.1,<1"
|
|
41
|
+
lxml = ">=5.4.0,<6"
|
|
42
|
+
bokeh = ">=3.7.3,<4"
|
|
43
|
+
protobuf = "5.28.3"
|
|
44
|
+
psutil = ">=7.0.0,<8"
|
|
45
|
+
baseflow = "^0.1.0"
|
|
46
|
+
|
|
47
|
+
[tool.poetry.group.test.dependencies]
|
|
48
|
+
pytest = ">=7.4.3"
|
|
49
|
+
flake8 = ">=6.1.0"
|
|
50
|
+
nox-poetry = "^1.2.0"
|
|
51
|
+
pytest-cov = "^6.2.1"
|
|
52
|
+
pytest-json-ctrf = "^0.3.5"
|
|
53
|
+
|
|
54
|
+
[tool.poetry.group.dev.dependencies]
|
|
55
|
+
sphinx = ">=7.2.6"
|
|
56
|
+
sphinx-design = ">=0.5.0"
|
|
57
|
+
numpydoc = ">=1.6.0"
|
|
58
|
+
pre-commit = ">=3.6.0"
|
|
59
|
+
pre-commit-hooks = ">=4.5.0"
|
|
60
|
+
flake8-docstrings = ">=1.7.0"
|
|
61
|
+
myst-nb = ">=1.0.0"
|
|
62
|
+
nbstripout = ">=0.7.1"
|
|
63
|
+
pickleshare = ">=0.7.5"
|
|
64
|
+
sphinx-autoapi = "3.0.0"
|
|
65
|
+
pydata-sphinx-theme = ">=0.16.0"
|
|
66
|
+
sphinx-autobuild = ">=2024.10.3"
|
|
67
|
+
dask = {extras = ["distributed"], version = "^2025.5.1"}
|
|
68
|
+
tomli = ">=2.2.1"
|
|
69
|
+
geoviews = ">=1.14.1,<2"
|
|
70
|
+
hvplot = ">=0.12.0,<1"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
[tool.numpydoc_validation]
|
|
74
|
+
checks = [
|
|
75
|
+
"all", # report on all checks, except the below
|
|
76
|
+
"EX01", # No examples section found
|
|
77
|
+
"RT01", # No Returns section found
|
|
78
|
+
"SA01", # See Also section not found
|
|
79
|
+
"ES01", # No extended summary found
|
|
80
|
+
"GL01", # Docstring text (summary) should start in the line immediately
|
|
81
|
+
"SS06", # Summary should fit in a single line
|
|
82
|
+
"PR01", # Parameters {missing_params} not documented
|
|
83
|
+
"GL02" # Closing quotes should be placed in the line after the last text in docstring"
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
[build-system]
|
|
87
|
+
requires = ["poetry-core"]
|
|
88
|
+
build-backend = "poetry.core.masonry.api"
|
|
89
|
+
|
|
90
|
+
[tool.poetry.requires-plugins]
|
|
91
|
+
poetry-plugin-export = ">=1.8"
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
"""Initialize the TEEHR package."""
|
|
2
|
-
|
|
2
|
+
import warnings
|
|
3
|
+
|
|
4
|
+
__version__ = "0.5.1dev10"
|
|
5
|
+
|
|
6
|
+
with warnings.catch_warnings():
|
|
7
|
+
warnings.simplefilter("ignore", UserWarning)
|
|
8
|
+
import pandera.pyspark as ps # noqa: F401
|
|
3
9
|
|
|
4
10
|
from teehr.evaluation.evaluation import Evaluation # noqa
|
|
5
11
|
from teehr.models.metrics.deterministic_models import DeterministicMetrics # noqa
|
|
6
12
|
from teehr.models.metrics.probabilistic_models import ProbabilisticMetrics # noqa
|
|
7
|
-
from teehr.models.metrics.signature_models import
|
|
13
|
+
from teehr.models.metrics.signature_models import Signatures # noqa
|
|
8
14
|
from teehr.models.metrics.bootstrap_models import Bootstrappers # noqa
|
|
9
15
|
from teehr.models.metrics.basemodels import Operators # noqa
|
|
10
16
|
from teehr.models.pydantic_table_models import ( # noqa
|
|
@@ -26,4 +32,8 @@ from teehr.models.filters import ( # noqa
|
|
|
26
32
|
)
|
|
27
33
|
|
|
28
34
|
from teehr.models.calculated_fields.row_level import RowLevelCalculatedFields # noqa
|
|
29
|
-
from teehr.models.calculated_fields.timeseries_aware import TimeseriesAwareCalculatedFields # noqa
|
|
35
|
+
from teehr.models.calculated_fields.timeseries_aware import TimeseriesAwareCalculatedFields # noqa
|
|
36
|
+
from teehr.models.generate.timeseries_generator_models import ( # noqa
|
|
37
|
+
SignatureTimeseriesGenerators,
|
|
38
|
+
BenchmarkForecastGenerators
|
|
39
|
+
)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Evaluation module."""
|
|
2
|
+
import psutil
|
|
2
3
|
from datetime import datetime
|
|
3
4
|
from typing import Union, Literal, List
|
|
4
5
|
from pathlib import Path
|
|
@@ -22,11 +23,19 @@ from teehr.loading.s3.clone_from_s3 import (
|
|
|
22
23
|
list_s3_evaluations,
|
|
23
24
|
clone_from_s3
|
|
24
25
|
)
|
|
26
|
+
from teehr.models.filters import TableFilter, FilterBaseModel, TableNamesEnum
|
|
25
27
|
import teehr.const as const
|
|
26
28
|
from teehr.evaluation.fetch import Fetch
|
|
27
29
|
from teehr.evaluation.metrics import Metrics
|
|
30
|
+
from teehr.evaluation.generate import GeneratedTimeseries
|
|
28
31
|
import pandas as pd
|
|
29
32
|
from teehr.visualization.dataframe_accessor import TEEHRDataFrameAccessor # noqa
|
|
33
|
+
import re
|
|
34
|
+
import teehr
|
|
35
|
+
import s3fs
|
|
36
|
+
from fsspec.implementations.local import LocalFileSystem
|
|
37
|
+
import pyspark.sql as ps
|
|
38
|
+
from teehr.querying.filter_format import validate_and_apply_filters
|
|
30
39
|
|
|
31
40
|
|
|
32
41
|
logger = logging.getLogger(__name__)
|
|
@@ -81,9 +90,16 @@ class Evaluation:
|
|
|
81
90
|
logger.error(f"Directory {self.dir_path} does not exist.")
|
|
82
91
|
raise NotADirectoryError
|
|
83
92
|
|
|
93
|
+
# Check version of Evaluation
|
|
94
|
+
if create_dir is False:
|
|
95
|
+
self.check_evaluation_version()
|
|
96
|
+
|
|
84
97
|
# Create a local Spark Session if one is not provided.
|
|
85
98
|
if not self.spark:
|
|
86
99
|
logger.info("Creating a new Spark session.")
|
|
100
|
+
memory_info = psutil.virtual_memory()
|
|
101
|
+
driver_memory = 0.75 * memory_info.available / (1024**3) # Use 75% of available memory
|
|
102
|
+
driver_maxresultsize = 0.5 * driver_memory
|
|
87
103
|
conf = (
|
|
88
104
|
SparkConf()
|
|
89
105
|
.setAppName("TEEHR")
|
|
@@ -94,10 +110,18 @@ class Evaluation:
|
|
|
94
110
|
.set("spark.sql.execution.arrow.pyspark.enabled", "true")
|
|
95
111
|
.set("spark.sql.session.timeZone", "UTC")
|
|
96
112
|
.set("spark.driver.host", "localhost")
|
|
113
|
+
.set("spark.jars.packages", "org.apache.hadoop:hadoop-aws:3.4.1")
|
|
97
114
|
.set("spark.sql.parquet.enableVectorizedReader", "false")
|
|
115
|
+
.set("spark.driver.memory", f"{int(driver_memory)}g")
|
|
116
|
+
.set("spark.driver.maxResultSize", f"{int(driver_maxresultsize)}g")
|
|
98
117
|
)
|
|
99
118
|
self.spark = SparkSession.builder.config(conf=conf).getOrCreate()
|
|
100
119
|
|
|
120
|
+
@property
|
|
121
|
+
def generate(self) -> GeneratedTimeseries:
|
|
122
|
+
"""The generate component class for generating synthetic data."""
|
|
123
|
+
return GeneratedTimeseries(self)
|
|
124
|
+
|
|
101
125
|
@property
|
|
102
126
|
def fetch(self) -> Fetch:
|
|
103
127
|
"""The fetch component class for accessing external data."""
|
|
@@ -347,3 +371,104 @@ class Evaluation:
|
|
|
347
371
|
self.joined_timeseries.to_sdf().createOrReplaceTempView("joined_timeseries")
|
|
348
372
|
|
|
349
373
|
return self.spark.sql(query)
|
|
374
|
+
|
|
375
|
+
def check_evaluation_version(self):
|
|
376
|
+
"""Check the version of the TEEHR Evaluation."""
|
|
377
|
+
if self.is_s3:
|
|
378
|
+
fs = s3fs.S3FileSystem(anon=True)
|
|
379
|
+
version_file = self.dir_path.path + "/" + "version"
|
|
380
|
+
else:
|
|
381
|
+
fs = LocalFileSystem()
|
|
382
|
+
version_file = Path(self.dir_path, "version")
|
|
383
|
+
if not fs.exists(version_file):
|
|
384
|
+
logger.error(f"Version file not found in {self.dir_path}.")
|
|
385
|
+
if self.is_s3:
|
|
386
|
+
err_msg = (
|
|
387
|
+
f"Please create a version file in {self.dir_path}."
|
|
388
|
+
)
|
|
389
|
+
logger.error(err_msg)
|
|
390
|
+
raise Exception(err_msg)
|
|
391
|
+
else:
|
|
392
|
+
# TODO: Change this to raise an error in v0.6.
|
|
393
|
+
version = teehr.__version__
|
|
394
|
+
with fs.open(version_file, "w") as f:
|
|
395
|
+
f.write(version)
|
|
396
|
+
logger.info(
|
|
397
|
+
f"Created version file in {self.dir_path}."
|
|
398
|
+
" In the future this will raise an error."
|
|
399
|
+
)
|
|
400
|
+
else:
|
|
401
|
+
with fs.open(version_file) as f:
|
|
402
|
+
version_txt = str(f.read().strip())
|
|
403
|
+
match = re.findall(r'(\d+\.\d+\.\d+)', version_txt) # Assumes semantic versioning
|
|
404
|
+
if len(match) != 1:
|
|
405
|
+
err_msg = f"Invalid version format in {self.dir_path}: {version_txt}"
|
|
406
|
+
logger.error(err_msg)
|
|
407
|
+
raise ValueError(err_msg)
|
|
408
|
+
else:
|
|
409
|
+
version = match[0]
|
|
410
|
+
# TODO: Uncomment this in v0.6
|
|
411
|
+
# if version < "0.6.0":
|
|
412
|
+
# err_msg = (
|
|
413
|
+
# f"Evaluation version {version} in {self.dir_path} is less than 0.6."
|
|
414
|
+
# " Please run the migration to upgrade to the latest version."
|
|
415
|
+
# )
|
|
416
|
+
# logger.error(err_msg)
|
|
417
|
+
# raise ValueError(err_msg)
|
|
418
|
+
# else:
|
|
419
|
+
# # Update the version to the latest
|
|
420
|
+
# pass
|
|
421
|
+
logger.info(
|
|
422
|
+
f"Found evaluation version {version} in {self.dir_path}."
|
|
423
|
+
" Future versions v0.6 and greater will require a conversion"
|
|
424
|
+
" to a new format."
|
|
425
|
+
)
|
|
426
|
+
return version
|
|
427
|
+
|
|
428
|
+
def filter(
|
|
429
|
+
self,
|
|
430
|
+
table_name: TableNamesEnum = None,
|
|
431
|
+
filters: Union[
|
|
432
|
+
str, dict, FilterBaseModel,
|
|
433
|
+
List[Union[str, dict, FilterBaseModel]]
|
|
434
|
+
] = None,
|
|
435
|
+
table_filter: TableFilter = None
|
|
436
|
+
) -> ps.DataFrame:
|
|
437
|
+
"""Apply filters to a table returning a sdf.
|
|
438
|
+
|
|
439
|
+
Parameters
|
|
440
|
+
----------
|
|
441
|
+
table_name: TableNamesEnum
|
|
442
|
+
The name of the table to filter. Defaults to None.
|
|
443
|
+
filters: Union[str, dict, FilterBaseModel, List[Union[str, dict, FilterBaseModel]]]
|
|
444
|
+
The filters to apply to the table. Defaults to None.
|
|
445
|
+
table_filter: TableFilter
|
|
446
|
+
A TableFilter object containing the table name and filters.
|
|
447
|
+
Defaults to None.
|
|
448
|
+
"""
|
|
449
|
+
table_mapper = {
|
|
450
|
+
"primary_timeseries": self.primary_timeseries,
|
|
451
|
+
"secondary_timeseries": self.secondary_timeseries,
|
|
452
|
+
"locations": self.locations,
|
|
453
|
+
"units": self.units,
|
|
454
|
+
"variables": self.variables,
|
|
455
|
+
"configurations": self.configurations,
|
|
456
|
+
"attributes": self.attributes,
|
|
457
|
+
"location_attributes": self.location_attributes,
|
|
458
|
+
"location_crosswalks": self.location_crosswalks,
|
|
459
|
+
"joined_timeseries": self.joined_timeseries,
|
|
460
|
+
}
|
|
461
|
+
if table_filter is not None:
|
|
462
|
+
table_name = table_filter.table_name
|
|
463
|
+
filters = table_filter.filters
|
|
464
|
+
if table_name is None:
|
|
465
|
+
raise ValueError("Table name must be specified.")
|
|
466
|
+
base_table = table_mapper.get(table_name)
|
|
467
|
+
return validate_and_apply_filters(
|
|
468
|
+
sdf=base_table.to_sdf(),
|
|
469
|
+
filters=filters,
|
|
470
|
+
filter_model=base_table.filter_model,
|
|
471
|
+
fields_enum=base_table.field_enum(),
|
|
472
|
+
dataframe_schema=base_table._get_schema("pandas"),
|
|
473
|
+
validate=base_table.validate_filter_field_types
|
|
474
|
+
)
|