Source code for eml_urban_hydro_model.preprocessing

import numpy as np
import pandas as pd
from pandera.typing import DataFrame

from .type_models.model_input import ModelInput
from .type_models.preprocessing_parameters import PreprocessingParameters


[docs] def preprocess( original_rainfall: DataFrame[ModelInput], params: PreprocessingParameters = PreprocessingParameters(), ) -> DataFrame[ModelInput]: """Modify rainfall intensity using a memory term with heavyside equation.""" T_steps = params.T // params.resolution # Memory duration in terms of time steps alpha = 0.7 # Initialize modified rainfall array results = np.zeros_like(original_rainfall["precp"]) for t in range(len(original_rainfall)): # First term if original_rainfall["precp"].iloc[t] > params.ic: direct_contribution = original_rainfall["precp"].iloc[t] else: direct_contribution = 0 # Second term memory_contribution = 0 for tau in range(T_steps): if t - tau >= 0: # Ensure valid index past_rainfall = original_rainfall["precp"].iloc[t - tau] if past_rainfall <= params.ic: # Only consider rainfall below ic memory_contribution += past_rainfall * alpha * (tau / T_steps) * np.exp((tau - T_steps) / T_steps) memory_contribution /= T_steps # Combine contributions results[t] = direct_contribution + memory_contribution # Create a new DataFrame with the modified rainfall modified_rainfall = pd.DataFrame( {"time": original_rainfall["time"], "precp": results}, index=original_rainfall.index ) return modified_rainfall