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.
Files changed (146) hide show
  1. {teehr-0.4.13 → teehr-0.5.1.dev10}/PKG-INFO +33 -29
  2. teehr-0.5.1.dev10/pyproject.toml +91 -0
  3. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/__init__.py +13 -3
  4. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/evaluation.py +125 -0
  5. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/fetch.py +134 -77
  6. teehr-0.5.1.dev10/src/teehr/evaluation/generate.py +232 -0
  7. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/metrics.py +149 -31
  8. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/attribute_table.py +2 -1
  9. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/base_table.py +165 -30
  10. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/configuration_table.py +2 -1
  11. teehr-0.5.1.dev10/src/teehr/evaluation/tables/domain_table.py +97 -0
  12. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/joined_timeseries_table.py +77 -25
  13. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/location_attribute_table.py +96 -5
  14. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/location_crosswalk_table.py +64 -5
  15. teehr-0.5.1.dev10/src/teehr/evaluation/tables/location_table.py +286 -0
  16. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/primary_timeseries_table.py +74 -4
  17. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/secondary_timeseries_table.py +80 -12
  18. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/timeseries_table.py +31 -21
  19. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/unit_table.py +2 -1
  20. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/tables/variable_table.py +2 -1
  21. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/03-metric_queries.ipynb +1 -1
  22. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/const.py +8 -0
  23. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/grid_utils.py +5 -5
  24. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/nwm_grids.py +81 -37
  25. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/nwm_points.py +82 -36
  26. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/point_utils.py +5 -6
  27. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/retrospective_grids.py +1 -4
  28. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/retrospective_points.py +5 -17
  29. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/usgs/usgs.py +195 -79
  30. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/utils.py +196 -71
  31. teehr-0.5.1.dev10/src/teehr/generate/utils.py +179 -0
  32. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/s3/clone_from_s3.py +14 -3
  33. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/timeseries.py +17 -4
  34. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/utils.py +72 -17
  35. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/bootstrap_funcs.py +82 -5
  36. teehr-0.5.1.dev10/src/teehr/metrics/deterministic_funcs.py +661 -0
  37. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/probabilistic_funcs.py +38 -20
  38. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/signature_funcs.py +86 -21
  39. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/calculated_fields/row_level.py +99 -6
  40. teehr-0.5.1.dev10/src/teehr/models/calculated_fields/timeseries_aware.py +2447 -0
  41. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/filters.py +31 -7
  42. teehr-0.5.1.dev10/src/teehr/models/generate/base.py +86 -0
  43. teehr-0.5.1.dev10/src/teehr/models/generate/timeseries_generator_models.py +229 -0
  44. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/basemodels.py +1 -1
  45. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/deterministic_models.py +156 -40
  46. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/metric_attributes.py +16 -0
  47. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/probabilistic_models.py +5 -4
  48. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/signature_models.py +99 -18
  49. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/pandera_dataframe_schemas.py +1 -1
  50. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/pydantic_table_models.py +0 -1
  51. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/table_enums.py +15 -0
  52. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/filter_format.py +31 -7
  53. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/metric_format.py +4 -8
  54. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utilities/generate_weights.py +2 -2
  55. teehr-0.5.1.dev10/src/teehr/utils/remove_spark_jars.py +36 -0
  56. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/visualization/dataframe_accessor.py +298 -76
  57. teehr-0.4.13/pyproject.toml +0 -78
  58. teehr-0.4.13/src/teehr/evaluation/tables/domain_table.py +0 -35
  59. teehr-0.4.13/src/teehr/evaluation/tables/location_table.py +0 -155
  60. teehr-0.4.13/src/teehr/metrics/deterministic_funcs.py +0 -471
  61. teehr-0.4.13/src/teehr/models/calculated_fields/timeseries_aware.py +0 -200
  62. teehr-0.4.13/src/teehr/utils/install_spark_jars.py +0 -32
  63. {teehr-0.4.13 → teehr-0.5.1.dev10}/LICENSE.md +0 -0
  64. {teehr-0.4.13 → teehr-0.5.1.dev10}/README.md +0 -0
  65. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/const.py +0 -0
  66. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/__init__.py +0 -0
  67. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/evaluation/utils.py +0 -0
  68. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/__init__.py +0 -0
  69. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/ensemble_example_data.py +0 -0
  70. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/nwm_gridded_example_data.py +0 -0
  71. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/nwm_streamflow_example_data.py +0 -0
  72. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/two_locations.py +0 -0
  73. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/example_data/v0_3_test_study.py +0 -0
  74. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/01-evaluation_setup.ipynb +0 -0
  75. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/02-table_queries.ipynb +0 -0
  76. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/04-table_filters.ipynb +0 -0
  77. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/05-2_site_setup.ipynb +0 -0
  78. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/06-2_site_query.ipynb +0 -0
  79. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/07-2_site_plotting.ipynb +0 -0
  80. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/08-sql.ipynb +0 -0
  81. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/09-ensemble_metric_queries.ipynb +0 -0
  82. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/__init__.py +0 -0
  83. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/clone_from_s3.ipynb +0 -0
  84. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/load_netcdf.ipynb +0 -0
  85. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/ngen_example.py +0 -0
  86. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/partition_by_reference_time.py +0 -0
  87. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_ensemble_example.py +0 -0
  88. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_evaluation.py +0 -0
  89. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_nwm_grid_example.py +0 -0
  90. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/setup_nwm_streamflow_example.py +0 -0
  91. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/examples/two_site_debug_script.py +0 -0
  92. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/__init__.py +0 -0
  93. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/nwm/__init__.py +0 -0
  94. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/readme.md +0 -0
  95. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/fetching/usgs/__init__.py +0 -0
  96. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/__init__.py +0 -0
  97. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/location_attributes.py +0 -0
  98. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/location_crosswalks.py +0 -0
  99. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/locations.py +0 -0
  100. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/loading/readme.md +0 -0
  101. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/__init__.py +0 -0
  102. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/gumboot_bootstrap.py +0 -0
  103. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/metrics/readme.md +0 -0
  104. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/__init__.py +0 -0
  105. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/calculated_fields/base.py +0 -0
  106. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/__init__.py +0 -0
  107. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm12_grid.py +0 -0
  108. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm12_point.py +0 -0
  109. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm20_grid.py +0 -0
  110. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm20_point.py +0 -0
  111. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm22_grid.py +0 -0
  112. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm22_point.py +0 -0
  113. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm30_grid.py +0 -0
  114. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/nwm30_point.py +0 -0
  115. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/fetching/utils.py +0 -0
  116. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/__init__.py +0 -0
  117. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/metrics/bootstrap_models.py +0 -0
  118. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/readme.md +0 -0
  119. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/models/str_enum.py +0 -0
  120. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/__init__.py +0 -0
  121. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/readme.md +0 -0
  122. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/querying/utils.py +0 -0
  123. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/__init__.py +0 -0
  124. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/cache/readme.md +0 -0
  125. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/attributes/_readme.md +0 -0
  126. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/attributes/attributes.csv +0 -0
  127. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/configurations/_readme.md +0 -0
  128. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/configurations/configurations.csv +0 -0
  129. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/joined_timeseries/_readme.md +0 -0
  130. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/location_attributes/_readme.md +0 -0
  131. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/location_crosswalks/_readme.md +0 -0
  132. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/locations/_readme.md +0 -0
  133. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/primary_timeseries/_readme.md +0 -0
  134. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/secondary_timeseries/_readme.md +0 -0
  135. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/units/_readme.md +0 -0
  136. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/units/units.csv +0 -0
  137. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/variables/_readme.md +0 -0
  138. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/dataset/variables/variables.csv +0 -0
  139. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/gitignore_template +0 -0
  140. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/readme.md +0 -0
  141. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/scripts/__init__.py +0 -0
  142. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/template/scripts/user_defined_fields.py +0 -0
  143. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utilities/__init__.py +0 -0
  144. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utils/s3path.py +0 -0
  145. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/utils/utils.py +0 -0
  146. {teehr-0.4.13 → teehr-0.5.1.dev10}/src/teehr/visualization/__init__.py +0 -0
@@ -1,42 +1,46 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: teehr
3
- Version: 0.4.13
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,<4.0
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: arch (>=7.0.0,<8.0.0)
15
- Requires-Dist: bokeh (>=3.5.0,<4.0.0)
16
- Requires-Dist: dask[dataframe] (==2025.*)
17
- Requires-Dist: dataretrieval (>=1.0.9,<2.0.0)
18
- Requires-Dist: fsspec (>=2023.10.0)
19
- Requires-Dist: gcsfs (>=2023.10.0)
20
- Requires-Dist: geopandas (>=0.14.0,<0.15.0)
21
- Requires-Dist: geoviews (>=1.14.0,<2.0.0)
22
- Requires-Dist: h5py (==3.12.1)
23
- Requires-Dist: httpx (>=0.25.1,<0.26.0)
24
- Requires-Dist: hvplot (>=0.11.1,<0.12.0)
25
- Requires-Dist: kerchunk (>=0.2.2,<0.3.0)
26
- Requires-Dist: lxml (>=5.3.2,<6.0.0)
27
- Requires-Dist: netcdf4 (==1.6.5)
28
- Requires-Dist: numba (>=0.60.0,<0.61.0)
29
- Requires-Dist: pandas (>=2.2.0,<3.0.0)
30
- Requires-Dist: pandera[pyspark] (>=0.20.4,<0.21.0)
31
- Requires-Dist: pyarrow (>=15.0.0,<16.0.0)
32
- Requires-Dist: pydantic (>=2.4.2,<3.0.0)
33
- Requires-Dist: pyspark[pandas-on-spark] (>=3.5.2,<4.0.0)
34
- Requires-Dist: rasterio (>=1.3.9,<2.0.0)
35
- Requires-Dist: rioxarray (>=0.15.0,<0.16.0)
36
- Requires-Dist: s3fs (>=2023.10.0)
37
- Requires-Dist: scoringrules (>=0.7.1,<0.8.0)
38
- Requires-Dist: ujson (>=5.8.0,<6.0.0)
39
- Requires-Dist: zarr (>=2.16.1,<3.0.0)
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
  ![alt text](https://github.com/RTIInternational/teehr/blob/main/docs/images/teehr.png)
@@ -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
- __version__ = "0.4.13"
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 SignatureMetrics # noqa
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
+ )