BESS-JPL 1.15.0__tar.gz → 1.16.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of BESS-JPL might be problematic. Click here for more details.
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/BESS_JPL.py +1 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/canopy_shortwave_radiation.py +1 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/carbon_water_fluxes.py +0 -19
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_C4_fraction.py +5 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_NDVI_maximum.py +3 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_NDVI_minimum.py +3 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_ball_berry_slope_C3.py +1 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_ball_berry_slope_C4.py +1 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_kn.py +1 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_peakVCmax_C3.py +3 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_peakVCmax_C4.py +3 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/model.py +1 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL.egg-info/PKG-INFO +2 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL.egg-info/SOURCES.txt +0 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL.egg-info/requires.txt +1 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/PKG-INFO +2 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/pyproject.toml +2 -1
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/tests/test_import_dependencies.py +1 -0
- bess_jpl-1.15.0/BESS_JPL/check_distribution.py +0 -118
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/.github/workflows/ci.yml +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/.github/workflows/python-publish.yml +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/.gitignore +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS Sensitivity.ipynb +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/C3_photosynthesis.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/C4_fraction.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/C4_fraction.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/C4_photosynthesis.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/FVC_from_NDVI.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/LAI_from_NDVI.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/NDVI_maximum.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/NDVI_maximum.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/NDVI_minimum.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/NDVI_minimum.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/__init__.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/ball_berry_intercept_C3.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/ball_berry_intercept_C3.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/ball_berry_slope_C3.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/ball_berry_slope_C3.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/ball_berry_slope_C4.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/ball_berry_slope_C4.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/calculate_VCmax.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/canopy_energy_balance.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/canopy_longwave_radiation.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/carbon_uptake_efficiency.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/carbon_uptake_efficiency.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/constants.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/interpolate_C3_C4.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/kn.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/kn.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_ball_berry_intercept_C3.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/load_carbon_uptake_efficiency.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/meteorology.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/peakVCmax_C3.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/peakVCmax_C3.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/peakVCmax_C4.jpeg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/peakVCmax_C4.tif +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/process_BESS_table.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/soil_energy_balance.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL/version.txt +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL.egg-info/dependency_links.txt +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/BESS_JPL.egg-info/top_level.txt +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/C4 Fraction.ipynb +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/Dockerfile +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/LICENSE +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/Li_2023_RSE.pdf +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/MANIFEST.in +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/Processing BESS with rasters with default parameters.ipynb +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/Processing BESS with rasters.ipynb +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/README.md +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/makefile +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/processing_BESS_with_rasters_and_default_parameters.py +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/setup.cfg +0 -0
- {bess_jpl-1.15.0 → bess_jpl-1.16.0}/tests/test_import_BESS_JPL.py +0 -0
|
@@ -6,7 +6,7 @@ import numpy as np
|
|
|
6
6
|
import rasters as rt
|
|
7
7
|
from rasters import Raster, RasterGeometry
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from check_distribution import check_distribution
|
|
10
10
|
|
|
11
11
|
from sun_angles import calculate_SZA_from_DOY_and_hour
|
|
12
12
|
from solar_apparent_time import solar_day_of_year_for_area, solar_hour_of_day_for_area
|
|
@@ -12,25 +12,6 @@ from .soil_energy_balance import soil_energy_balance
|
|
|
12
12
|
|
|
13
13
|
PASSES = 1
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
def load_ball_berry_intercept_C3(self, geometry: RasterGeometry) -> Raster:
|
|
17
|
-
filename = join(abspath(dirname(__file__)), "ball_berry_intercept_C3.tif")
|
|
18
|
-
image = rt.Raster.open(filename, geometry=geometry, resampling=self.resampling)
|
|
19
|
-
|
|
20
|
-
return image
|
|
21
|
-
|
|
22
|
-
def load_ball_berry_slope_C3(self, geometry: RasterGeometry) -> Raster:
|
|
23
|
-
filename = join(abspath(dirname(__file__)), "ball_berry_slope_C3.tif")
|
|
24
|
-
image = rt.Raster.open(filename, geometry=geometry, resampling=self.resampling)
|
|
25
|
-
|
|
26
|
-
return image
|
|
27
|
-
|
|
28
|
-
def load_ball_berry_slope_C4(self, geometry: RasterGeometry) -> Raster:
|
|
29
|
-
filename = join(abspath(dirname(__file__)), "ball_berry_slope_C4.tif")
|
|
30
|
-
image = rt.Raster.open(filename, geometry=geometry, resampling=self.resampling)
|
|
31
|
-
|
|
32
|
-
return image
|
|
33
|
-
|
|
34
15
|
def carbon_water_fluxes(
|
|
35
16
|
canopy_temperature_K: np.ndarray, # canopy temperature in Kelvin
|
|
36
17
|
soil_temperature_K: np.ndarray, # soil temperature in Kelvin
|
|
@@ -3,8 +3,12 @@ from os.path import join, abspath, dirname
|
|
|
3
3
|
import rasters as rt
|
|
4
4
|
from rasters import Raster, RasterGeometry
|
|
5
5
|
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
6
8
|
def load_C4_fraction(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
9
|
filename = join(abspath(dirname(__file__)), "C4_fraction.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=resampling)
|
|
10
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling, nodata=np.nan)
|
|
11
|
+
image = rt.clip(image, 0, 100)
|
|
12
|
+
# TODO: scale C4_fraction to be within 0 and 1?
|
|
9
13
|
|
|
10
14
|
return image
|
|
@@ -3,8 +3,10 @@ from os.path import join, abspath, dirname
|
|
|
3
3
|
import rasters as rt
|
|
4
4
|
from rasters import Raster, RasterGeometry
|
|
5
5
|
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
6
8
|
def load_NDVI_maximum(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
9
|
filename = join(abspath(dirname(__file__)), "NDVI_maximum.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=resampling)
|
|
10
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling, nodata=np.nan)
|
|
9
11
|
|
|
10
12
|
return image
|
|
@@ -3,8 +3,10 @@ from os.path import join, abspath, dirname
|
|
|
3
3
|
import rasters as rt
|
|
4
4
|
from rasters import Raster, RasterGeometry
|
|
5
5
|
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
6
8
|
def load_NDVI_minimum(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
9
|
filename = join(abspath(dirname(__file__)), "NDVI_minimum.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=resampling)
|
|
10
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling, nodata=np.nan)
|
|
9
11
|
|
|
10
12
|
return image
|
|
@@ -5,6 +5,6 @@ from rasters import Raster, RasterGeometry
|
|
|
5
5
|
|
|
6
6
|
def load_ball_berry_slope_C3(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
7
|
filename = join(abspath(dirname(__file__)), "ball_berry_slope_C3.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=
|
|
8
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling)
|
|
9
9
|
|
|
10
10
|
return image
|
|
@@ -5,6 +5,6 @@ from rasters import Raster, RasterGeometry
|
|
|
5
5
|
|
|
6
6
|
def load_ball_berry_slope_C4(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
7
|
filename = join(abspath(dirname(__file__)), "ball_berry_slope_C4.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=
|
|
8
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling)
|
|
9
9
|
|
|
10
10
|
return image
|
|
@@ -5,6 +5,6 @@ from rasters import Raster, RasterGeometry
|
|
|
5
5
|
|
|
6
6
|
def load_kn(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
7
|
filename = join(abspath(dirname(__file__)), "kn.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=
|
|
8
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling)
|
|
9
9
|
|
|
10
10
|
return image
|
|
@@ -3,8 +3,10 @@ from os.path import join, abspath, dirname
|
|
|
3
3
|
import rasters as rt
|
|
4
4
|
from rasters import Raster, RasterGeometry
|
|
5
5
|
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
6
8
|
def load_peakVCmax_C3(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
9
|
filename = join(abspath(dirname(__file__)), "peakVCmax_C3.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=
|
|
10
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling, nodata=np.nan)
|
|
9
11
|
|
|
10
12
|
return image
|
|
@@ -3,8 +3,10 @@ from os.path import join, abspath, dirname
|
|
|
3
3
|
import rasters as rt
|
|
4
4
|
from rasters import Raster, RasterGeometry
|
|
5
5
|
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
6
8
|
def load_peakVCmax_C4(geometry: RasterGeometry = None, resampling: str = "nearest") -> Raster:
|
|
7
9
|
filename = join(abspath(dirname(__file__)), "peakVCmax_C4.tif")
|
|
8
|
-
image = Raster.open(filename, geometry=geometry, resampling=
|
|
10
|
+
image = Raster.open(filename, geometry=geometry, resampling=resampling, nodata=np.nan)
|
|
9
11
|
|
|
10
12
|
return image
|
|
@@ -6,7 +6,7 @@ import numpy as np
|
|
|
6
6
|
import rasters as rt
|
|
7
7
|
from rasters import Raster, RasterGeometry
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from check_distribution import check_distribution
|
|
10
10
|
|
|
11
11
|
from sun_angles import calculate_SZA_from_DOY_and_hour
|
|
12
12
|
from solar_apparent_time import solar_day_of_year_for_area, solar_hour_of_day_for_area
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: BESS-JPL
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.16.0
|
|
4
4
|
Summary: Breathing Earth System Simulator (BESS) Gross Primary Production (GPP) and Evapotranspiration (ET) Model Python
|
|
5
5
|
Author-email: Gregory Halverson <gregory.h.halverson@jpl.nasa.gov>
|
|
6
6
|
Project-URL: Homepage, https://github.com/JPL-Evapotranspiration-Algorithms/BESS-JPL
|
|
@@ -9,6 +9,7 @@ Classifier: Operating System :: OS Independent
|
|
|
9
9
|
Requires-Python: >=3.10
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
11
|
License-File: LICENSE
|
|
12
|
+
Requires-Dist: check-distribution
|
|
12
13
|
Requires-Dist: FLiESANN>=1.5.0
|
|
13
14
|
Requires-Dist: gedi-canopy-height>=1.1.0
|
|
14
15
|
Requires-Dist: GEOS5FP>=1.1.1
|
|
@@ -38,7 +38,6 @@ BESS_JPL/canopy_shortwave_radiation.py
|
|
|
38
38
|
BESS_JPL/carbon_uptake_efficiency.jpeg
|
|
39
39
|
BESS_JPL/carbon_uptake_efficiency.tif
|
|
40
40
|
BESS_JPL/carbon_water_fluxes.py
|
|
41
|
-
BESS_JPL/check_distribution.py
|
|
42
41
|
BESS_JPL/constants.py
|
|
43
42
|
BESS_JPL/interpolate_C3_C4.py
|
|
44
43
|
BESS_JPL/kn.jpeg
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: BESS-JPL
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.16.0
|
|
4
4
|
Summary: Breathing Earth System Simulator (BESS) Gross Primary Production (GPP) and Evapotranspiration (ET) Model Python
|
|
5
5
|
Author-email: Gregory Halverson <gregory.h.halverson@jpl.nasa.gov>
|
|
6
6
|
Project-URL: Homepage, https://github.com/JPL-Evapotranspiration-Algorithms/BESS-JPL
|
|
@@ -9,6 +9,7 @@ Classifier: Operating System :: OS Independent
|
|
|
9
9
|
Requires-Python: >=3.10
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
11
|
License-File: LICENSE
|
|
12
|
+
Requires-Dist: check-distribution
|
|
12
13
|
Requires-Dist: FLiESANN>=1.5.0
|
|
13
14
|
Requires-Dist: gedi-canopy-height>=1.1.0
|
|
14
15
|
Requires-Dist: GEOS5FP>=1.1.1
|
|
@@ -3,7 +3,7 @@ requires = ["setuptools>=60", "setuptools-scm>=8.0", "wheel"]
|
|
|
3
3
|
|
|
4
4
|
[project]
|
|
5
5
|
name = "BESS-JPL"
|
|
6
|
-
version = "1.
|
|
6
|
+
version = "1.16.0"
|
|
7
7
|
description = "Breathing Earth System Simulator (BESS) Gross Primary Production (GPP) and Evapotranspiration (ET) Model Python"
|
|
8
8
|
readme = "README.md"
|
|
9
9
|
authors = [
|
|
@@ -14,6 +14,7 @@ classifiers = [
|
|
|
14
14
|
"Operating System :: OS Independent",
|
|
15
15
|
]
|
|
16
16
|
dependencies = [
|
|
17
|
+
"check-distribution",
|
|
17
18
|
"FLiESANN>=1.5.0",
|
|
18
19
|
"gedi-canopy-height>=1.1.0",
|
|
19
20
|
"GEOS5FP>=1.1.1",
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Replacement for check_distribution package to avoid pycksum dependency.
|
|
3
|
-
|
|
4
|
-
This module provides data validation functionality that was previously
|
|
5
|
-
provided by the check-distribution package, which depends on pycksum
|
|
6
|
-
that doesn't compile on Python 3.12.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Union, Optional
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
|
|
13
|
-
# Try to import numpy, but make it optional
|
|
14
|
-
try:
|
|
15
|
-
import numpy as np
|
|
16
|
-
HAS_NUMPY = True
|
|
17
|
-
except ImportError:
|
|
18
|
-
np = None
|
|
19
|
-
HAS_NUMPY = False
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
logger = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def check_distribution(
|
|
26
|
-
data: Union["np.ndarray", float, int, None],
|
|
27
|
-
name: str,
|
|
28
|
-
time_UTC: Optional[datetime] = None
|
|
29
|
-
) -> None:
|
|
30
|
-
"""
|
|
31
|
-
Check and validate data distribution, logging warnings for invalid values.
|
|
32
|
-
|
|
33
|
-
This function validates input data and logs information about the distribution,
|
|
34
|
-
including warnings for NaN values, infinite values, and basic statistics.
|
|
35
|
-
|
|
36
|
-
Args:
|
|
37
|
-
data: The data to validate (numpy array, scalar, or None)
|
|
38
|
-
name: Name of the variable for logging purposes
|
|
39
|
-
time_UTC: Optional timestamp for logging context
|
|
40
|
-
|
|
41
|
-
Returns:
|
|
42
|
-
None
|
|
43
|
-
|
|
44
|
-
Raises:
|
|
45
|
-
Nothing - this function only logs warnings and information
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
# Create log prefix with time if provided
|
|
49
|
-
time_prefix = f"[{time_UTC}] " if time_UTC else ""
|
|
50
|
-
|
|
51
|
-
if data is None:
|
|
52
|
-
logger.warning(f"{time_prefix}{name}: data is None")
|
|
53
|
-
return
|
|
54
|
-
|
|
55
|
-
# Handle numpy arrays or array-like objects
|
|
56
|
-
if hasattr(data, 'shape') and hasattr(data, 'dtype'):
|
|
57
|
-
# This is likely a numpy array or array-like object
|
|
58
|
-
|
|
59
|
-
if hasattr(data, 'size') and data.size == 0:
|
|
60
|
-
logger.warning(f"{time_prefix}{name}: array is empty")
|
|
61
|
-
return
|
|
62
|
-
|
|
63
|
-
if HAS_NUMPY:
|
|
64
|
-
# Use numpy functions if available
|
|
65
|
-
# Check for NaN values
|
|
66
|
-
if np.any(np.isnan(data)):
|
|
67
|
-
nan_count = np.sum(np.isnan(data))
|
|
68
|
-
nan_percentage = (nan_count / data.size) * 100
|
|
69
|
-
logger.warning(f"{time_prefix}{name}: contains {nan_count} NaN values ({nan_percentage:.1f}%)")
|
|
70
|
-
|
|
71
|
-
# Check for infinite values
|
|
72
|
-
if np.any(np.isinf(data)):
|
|
73
|
-
inf_count = np.sum(np.isinf(data))
|
|
74
|
-
inf_percentage = (inf_count / data.size) * 100
|
|
75
|
-
logger.warning(f"{time_prefix}{name}: contains {inf_count} infinite values ({inf_percentage:.1f}%)")
|
|
76
|
-
|
|
77
|
-
# Calculate statistics for finite values only
|
|
78
|
-
finite_data = data[np.isfinite(data)]
|
|
79
|
-
if len(finite_data) > 0:
|
|
80
|
-
min_val = np.min(finite_data)
|
|
81
|
-
max_val = np.max(finite_data)
|
|
82
|
-
mean_val = np.mean(finite_data)
|
|
83
|
-
std_val = np.std(finite_data)
|
|
84
|
-
|
|
85
|
-
logger.debug(f"{time_prefix}{name}: shape={data.shape}, "
|
|
86
|
-
f"min={min_val:.6f}, max={max_val:.6f}, "
|
|
87
|
-
f"mean={mean_val:.6f}, std={std_val:.6f}")
|
|
88
|
-
else:
|
|
89
|
-
logger.warning(f"{time_prefix}{name}: no finite values found")
|
|
90
|
-
else:
|
|
91
|
-
# Fallback when numpy is not available
|
|
92
|
-
logger.debug(f"{time_prefix}{name}: array-like data validated (numpy not available for detailed analysis)")
|
|
93
|
-
|
|
94
|
-
else:
|
|
95
|
-
# Handle scalar values
|
|
96
|
-
try:
|
|
97
|
-
# Convert to float to check for NaN/inf
|
|
98
|
-
float_val = float(data)
|
|
99
|
-
|
|
100
|
-
if HAS_NUMPY:
|
|
101
|
-
if np.isnan(float_val):
|
|
102
|
-
logger.warning(f"{time_prefix}{name}: scalar value is NaN")
|
|
103
|
-
elif np.isinf(float_val):
|
|
104
|
-
logger.warning(f"{time_prefix}{name}: scalar value is infinite")
|
|
105
|
-
else:
|
|
106
|
-
logger.debug(f"{time_prefix}{name}: scalar value = {float_val:.6f}")
|
|
107
|
-
else:
|
|
108
|
-
# Basic validation without numpy
|
|
109
|
-
import math
|
|
110
|
-
if math.isnan(float_val):
|
|
111
|
-
logger.warning(f"{time_prefix}{name}: scalar value is NaN")
|
|
112
|
-
elif math.isinf(float_val):
|
|
113
|
-
logger.warning(f"{time_prefix}{name}: scalar value is infinite")
|
|
114
|
-
else:
|
|
115
|
-
logger.debug(f"{time_prefix}{name}: scalar value = {float_val:.6f}")
|
|
116
|
-
|
|
117
|
-
except (ValueError, TypeError) as e:
|
|
118
|
-
logger.warning(f"{time_prefix}{name}: cannot convert to float for validation: {e}")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bess_jpl-1.15.0 → bess_jpl-1.16.0}/Processing BESS with rasters with default parameters.ipynb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|