You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:43:15