所以我有一个正弦波发生器,它返回两个值,如
yield time, sine
。
我希望能够使用点函数向此生成器添加内容,如下所示:
my_generator.add_noise(mean=0, std=1).shuffle().to_pandas()
例如,
add_noise
将仅向 sine
值添加随机均匀噪声,同时保持 time
不变。 my_generator.add_noise(mean=0, std=1)
的输出将是另一个生成器,但带有嘈杂的 sine
.
我的想法是以类似于 TensorFlow Dataset 的方式逐步使用它。但是我找不到怎么做可能是因为对谷歌的单词一无所知。
另外,这是好习惯吗?还是更好的方法?我正在做一个数据集生成器来尝试一些算法,我希望它是可扩展的。因此,如果我将生成器更改为对数生成器,则无需更改噪声函数。
我有这样的部分解决方案:
import math
import random
import pandas as pd
class SineWaveGenerator:
def __init__(self, freq, amplitude, sampling_rate, num_samples):
self.freq = freq
self.amplitude = amplitude
self.sampling_rate = sampling_rate
self.num_samples = num_samples
def __iter__(self):
for i in range(self.num_samples):
time = i / self.sampling_rate
sine = self.amplitude * math.sin(2 * math.pi * self.freq * time)
yield time, sine
def add_noise(self, noise_amplitude):
for time, sine in self:
noisy_sine = sine + noise_amplitude * random.uniform(-1, 1)
yield time, noisy_sine
def to_pandas(self):
return pd.DataFrame(list(self), columns=["Time", "Sine"])
适用于:
sin_generator = SineWaveGenerator(freq=10, amplitude=1, sampling_rate=1000, num_samples=1000)
df = sin_generator.as_pandas()
或
sin_generator = SineWaveGenerator(freq=10, amplitude=1, sampling_rate=1000, num_samples=1000)
noisy_sine_wave = sine_wave.add_noise(noise_amplitude=0.1)
但以下中断:
sin_generator = SineWaveGenerator(freq=10, amplitude=1, sampling_rate=1000, num_samples=1000)
df_noisy_sine_wave = sine_wave.add_noise(noise_amplitude=0.1).as_pandas()
说:
AttributeError: 'generator' object has no attribute 'as_pandas'
所以根据评论(我也看了tf.data.Dataset的源代码。我做了以下解决方案:
class SineWaveGenerator:
# ... all the methods
def add_noise(self, mean: float = 0., std: float = 1.):
class SineNoisyNormalGenerator(SineWaveGenerator):
def __init__(self, generator):
self.generator = generator
def __iter__(self):
for date, sine in self.generator:
noisy_sine = sine + np.random.normal(mean, std)
yield date, noisy_sine
return SineNoisyNormalGenerator(self)
我现在可以做:
sin_generator = SineWaveGenerator(freq=10, amplitude=1, sampling_rate=1000, num_samples=1000)
noisy_sine_generator = sine_wave.add_noise(noise_amplitude=0.1)