Source code for foxes.input.states.create.random_abl_states
import pandas as pd
import numpy as np
import foxes.variables as FV
import foxes.constants as FC
[docs]
def create_random_abl_states(
n_states, cols_minmax, var2col={}, mol_abs_range=(50.0, 5000.0), normalize=True
):
"""
Create random abl states.
Parameters
----------
n_states: int
The number of states
cols_minmax: dict
For each variable the min and max values,
keys: variable name str, values: array_like
with length 2
var2col: dict, optional
Mapping from variables to column names
mol_abs_range: tuple
Min and max of allowed MOL values, set to
nan if exceeded (i.e., neutral stratification)
normalize: bool
Normalize weights to 1
Returns
-------
data: pandas.DataFrame
The created states data
:group: input.states.create
"""
data = pd.DataFrame(index=range(n_states))
data.index.name = FC.STATE
for v, mm in cols_minmax.items():
data[v] = np.random.uniform(low=mm[0], high=mm[1], size=(n_states,)).astype(
FC.DTYPE
)
cmol = var2col.get(FV.MOL, FV.MOL)
if cmol in data and mol_abs_range is not None:
sel = (data[cmol].abs() < mol_abs_range[0]) | (
data[cmol].abs() > mol_abs_range[1]
)
data.loc[sel, cmol] = np.nan
wcol = var2col.get(FV.WEIGHT, FV.WEIGHT)
if wcol in data and normalize:
data[wcol] /= data[wcol].sum()
return data
[docs]
def write_random_abl_states(
file_path,
n_states,
cols_minmax,
var2col={},
mol_abs_range=(50.0, 5000.0),
normalize=True,
verbosity=1,
digits="auto",
**kwargs
):
"""
Writes random abl states to file
Parameters
----------
file_path: str
Path to the file
n_states: int
The number of states
cols_minmax: dict
For each variable the min and max values,
keys: variable name str, values: array_like
with length 2
var2col: dict, optional
Mapping from variables to column names
mol_abs_range: tuple
Min and max of allowed MOL values, set to
nan if exceeded (i.e., neutral stratification)
normalize: bool
Normalize weights to 1
verbosity: int
The verbosity level, 0 = silent
digits: int or auto
The number of digits to be written
kwargs: dict, optional
Parameters for `pandas.DataFrame.to_csv`
"""
if verbosity:
print("Writing file", file_path)
data = create_random_abl_states(
n_states, cols_minmax, var2col, mol_abs_range, normalize
)
if digits is not None:
hdigits = {c: 4 for c in cols_minmax.keys()}
wcol = var2col.get(FV.WEIGHT, FV.WEIGHT)
if wcol in cols_minmax:
hdigits[wcol] = None
mcol = var2col.get(FV.MOL, FV.MOL)
if mcol in cols_minmax:
hdigits[mcol] = 1
tcol = var2col.get(FV.TI, FV.TI)
if tcol in cols_minmax:
hdigits[tcol] = 6
if isinstance(digits, str) and digits == "auto":
digits = hdigits
else:
digits = hdigits
if digits is not None:
for v, d in digits.items():
if d is not None:
data[v] = data[v].round(d)
data.to_csv(file_path, **kwargs)