生成器映射方法实现

问题描述 投票:0回答:1

所以我有一个正弦波发生器,它返回两个值,如

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'

python generator
1个回答
0
投票

所以根据评论(我也看了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)
© www.soinside.com 2019 - 2024. All rights reserved.