如何修改TimeSynth包为自定义时序添加红噪声?
给外部时序用TimeSynth加红噪声的解决方案
嘿,我明白你的困扰——TimeSynth默认是自己生成时序再叠加噪声,但你已经有现成的时序数据了,直接塞进去肯定会因为接口不匹配报错。下面给你两种实用的解决办法:
方法一:用自定义信号生成器包装你的时序(推荐)
这种办法不用改TimeSynth的源码,只需要写一个小类把你的numpy数组包装成TimeSynth能识别的信号生成器,实现它要求的sample_next方法就行:
import numpy as np import timesynth as ts class ExternalSignal: def __init__(self, data): self.data = data self.current_idx = 0 def sample_next(self, t, prev_samples=None, prev_errors=None): # 每次调用返回当前位置的时序值,然后索引往后走 if self.current_idx < len(self.data): val = self.data[self.current_idx] self.current_idx += 1 return val # 如果超出数据长度,这里可以根据需求返回0或者抛出异常 return 0.0 # 假设你的demand是已经生成好的numpy数组 demand = np.array([2.1, 4.3, 6.5, 8.7, 10.9]) # 初始化红噪声生成器 red_noise_gen = ts.noise.ColoredNoise(color='red') # 把你的时序包装成TimeSynth兼容的信号生成器 custom_signal = ExternalSignal(demand) # 创建TimeSeries实例,传入自定义信号和红噪声 ts_instance = ts.TimeSeries(signal_generator=custom_signal, noise_generator=red_noise_gen) # 采样时指定和你的时序长度一致的样本数 noisy_timeseries, original_signals, noise = ts_instance.sample(n_samples=len(demand)) # noisy_timeseries就是加了红噪声后的结果 print(noisy_timeseries)
这个方法的好处是完全遵循TimeSynth的原有设计,不会破坏库的结构,后续升级库也不用重新改代码。
方法二:直接修改TimeSynth的源码(快速测试用)
如果你只是临时用,想快速实现功能,可以直接修改timeseries.py里的sample方法,添加支持外部信号的逻辑:
找到你贴的那段循环所在的sample方法,修改成这样:
def sample(self, n_samples=None, time_vector=None, external_signal=None): # 保留原有的time_vector初始化等逻辑... # 处理外部信号的逻辑 if external_signal is not None: if len(external_signal) != n_samples: raise ValueError("外部信号长度必须和采样数一致") signals = external_signal.copy() else: # 原来的信号生成逻辑 signals = np.zeros(n_samples) for i in range(n_samples): t = time_vector[i] signal = self.signal_generator.sample_next(t, samples[:i-1], errors[:i-1]) signals[i] = signal # 噪声生成的循环保留不变 errors = np.zeros(n_samples) for i in range(n_samples): t = time_vector[i] if self.noise_generator is not None: errors[i] = self.noise_generator.sample_next(t, samples[:i-1], errors[:i-1]) # 合成最终时序 samples = signals + errors return samples, signals, errors
修改完之后,你就可以这样调用:
red_noise = ts.noise.ColoredNoise(color='red') ts_obj = ts.TimeSeries(noise_generator=red_noise) noisy_data, _, _ = ts_obj.sample(n_samples=len(demand), external_signal=demand)
不过这种方法的缺点是,如果你以后更新TimeSynth,修改的代码会被覆盖,需要重新改一次。
总结
推荐用第一种方法,更优雅也更易维护;第二种适合快速验证功能。两种方法都能顺利给你的外部时序加上TimeSynth的红噪声~
内容的提问来源于stack exchange,提问作者LBakker
相关产品推荐
相关产品推荐

