diff --git a/src/pysimmmulator/simulate.py b/src/pysimmmulator/simulate.py index 21ca723..c6d0acb 100644 --- a/src/pysimmmulator/simulate.py +++ b/src/pysimmmulator/simulate.py @@ -176,7 +176,19 @@ def _negative_replace(self, df: pd.DataFrame, column: str) -> pd.DataFrame: column (str): specified column to search for negativ values Returns: df (DataFrame): Treated dataframe with replacement""" - df.loc[df[column] < 0, column] = 0 + col_lower = column.lower() + is_cost_metric = ("cpc" in col_lower) or ("cpm" in col_lower) + + if is_cost_metric: + positives = df.loc[df[column] > 0, column] + epsilon = 1e-6 + if len(positives) > 0: + replacement = max(positives.quantile(0.01), epsilon) + else: + replacement = epsilon + df.loc[df[column] <= 0, column] = replacement + else: + df.loc[df[column] < 0, column] = 0 return df def simulate_media(self, true_cpm: dict, true_cpc: dict, noisy_cpm_cpc: dict) -> None: