Source code for pedophysics.predict.water
import numpy as np
from .water_from_ec import WaterFromEC
from .water_from_perm import WaterFromPerm
from .frequency_perm import FrequencyPerm
from .frequency_ec import FrequencyEC
from .temperature import Temperature
from .bulk_ec_dc_tc import shift_to_bulk_ec_dc_tc
[docs]def Water(soil):
"""
Return and compute missing values of the soil.df.water attribute using soil.df.bulk_perm or soil.df.bulk_ec.
This function performs calculations to fill in missing water content values in the soil DataFrame based on bulk permeability (bulk_perm) and electrical conductivity (bulk_ec_dc_tc).
It employs different strategies based on available data and sets conditions for water content calculation.
Parameters
----------
soil : object
A custom soil object that contains:
- df : DataFrame
Data Frame containing all the quantitative information of soil array-like attributes for each state. Includes columns: water, bulk_perm, frequency_perm, and bulk_ec_dc_tc
- info : DataFrame
Data Frame containing descriptive information about how each array-like attribute was determined or modified.
- n_states : int
Number of states or records in the dataframe.
Returns
-------
np.ndarray
soil.df.water.values: an array of updated or original soil volumetric water content values
External functions
--------
Temperature : Set missing values of soil.df.temperature and return
FrequencyPerm : Set missing values of soil.df.frequency_perm and return
WaterFromPerm : Calculate missing values of soil.df.water based on soil.df.bulk_perm
WaterFromEC : Calculate missing values of soil.df.water based on soil.df.bulk_ec_dc_tc
FrequencyEC : Set missing values of soil.df.frequency_ec and return
shift_to_bulk_ec_dc_tc : Compute missing values of soil.df.bulk_ec_dc_tc based on soil.df.bulk_ec or soil.df.bulk_ec_dc
Example
-------
>>> sample = Soil( bulk_ec = [0.01, 0.02, 0.025, 0.030, 0.040],
clay = 10,
porosity = 0.47,
water_ec = 0.5)
>>> Water(sample)
array([0.105, 0.162, 0.185, 0.206, 0.243])
"""
# Condition to obtain water from bulk_perm
Temperature(soil)
FrequencyPerm(soil)
if any(np.isnan(soil.df.water[x]) and not np.isnan(soil.df.bulk_perm[x]) for x in range(soil.n_states)) and (np.isnan(soil.df.frequency_perm)).all():
soil.info['bulk_perm'] = [str(soil.info.bulk_perm[x]) + "--> Unmodified value. Please provide soil.frequency_perm" if True else soil.info.bulk_perm[x] for x in range(soil.n_states)]
elif any(np.isnan(soil.df.water[x]) and not np.isnan(soil.df.bulk_perm[x]) for x in range(soil.n_states)) and not (np.isnan(soil.df.frequency_perm).all()):
WaterFromPerm(soil)
# Condition to obtain water from bulk_ec_dc_tc
FrequencyEC(soil)
shift_to_bulk_ec_dc_tc(soil)
if any(np.isnan(soil.df.water[x]) and not np.isnan(soil.df.bulk_ec_dc_tc[x]) for x in range(soil.n_states)):
WaterFromEC(soil)
# Converting negative results due to fitting to zero
soil.info['water'] = [str(soil.info.water[x]) + "--> Set to 0 because of < 0 results" if soil.df.water[x]<0
or soil.info.water[x] ==str(soil.info.water[x]) + "--> Set to 0 because of < 0 results"
else soil.info.water[x] for x in range(soil.n_states)]
soil.df['water'] = [ 0 if soil.df.water[x]<0 else soil.df.water[x] for x in range(soil.n_states)]
return soil.df.water.values