"""噪音生成器 使用 Polars 零拷贝方式注入随机噪音特征。 """ import numpy as np import polars as pl class NoiseGenerator: """噪音生成器 生成服从标准正态分布的随机噪音列,使用 Polars 原生 API 实现零拷贝注入。 """ NOISE_PREFIX = "__noise__" def __init__(self, random_state: int = 42): """初始化噪音生成器 Args: random_state: 随机种子,保证可复现性 """ self.random_state = random_state def generate_noise( self, df: pl.DataFrame, n_noise: int, seed: int = 42, ) -> pl.DataFrame: """向 DataFrame 注入噪音特征 使用 Polars 原生 with_columns 实现零拷贝拼接。 Args: df: 原始数据 n_noise: 噪音列数量 seed: 随机种子 Returns: 添加了噪音列的 DataFrame """ np.random.seed(seed) n_rows = df.height # 直接生成 Polars Series 列表,然后一次性 with_columns # 实现零拷贝拼接,避免转换为 Pandas noise_series = [ pl.Series( f"{self.NOISE_PREFIX}{i}", np.random.randn(n_rows).astype(np.float32), dtype=pl.Float32, ) for i in range(n_noise) ] return df.with_columns(noise_series) def remove_noise(self, df: pl.DataFrame) -> pl.DataFrame: """移除噪音列 Args: df: 包含噪音列的数据 Returns: 移除了噪音列的数据 """ noise_cols = [col for col in df.columns if col.startswith(self.NOISE_PREFIX)] return df.drop(noise_cols) def get_noise_columns(self, df: pl.DataFrame) -> list[str]: """获取所有噪音列名 Args: df: 数据 Returns: 噪音列名列表 """ return [col for col in df.columns if col.startswith(self.NOISE_PREFIX)] def is_noise_column(self, col_name: str) -> bool: """判断是否为噪音列 Args: col_name: 列名 Returns: 是否为噪音列 """ return col_name.startswith(self.NOISE_PREFIX)