Skip to content

合成时间序列数据

已过时

请注意,此示例不适用于最新版本的 ydata-synthetic

请查看 ydata-sdk 以了解如何生成合成时间序列数据

为什么选择 YData Fabric 而不是 TimeGAN 进行时间序列数据生成

YData Fabric 提供了先进的时间序列合成数据生成能力,在灵活性、可扩展性和易用性方面超越了 TimeGAN。通过 YData Fabric,用户可以生成高质量的合成时间序列数据,同时受益于内置的数据分析工具,确保数据的完整性和一致性。与 TimeGAN 不同,TimeGAN 是单一模型,而 YData Fabric 提供了一个适用于不同类型数据集和行为的解决方案。此外,YData Fabric 设计用于可扩展性,能够无缝处理大型复杂的时间序列数据集。其引导式用户界面使得适应不同时间序列场景(从医疗保健到金融数据)变得容易,使其成为时间序列数据生成的更全面和灵活的解决方案。

更多关于 YData Fabric 与 TimeGAN 合成数据生成的比较,请阅读此博客文章

使用 TimeGAN 生成合成时间序列数据

尽管表格数据可能是最常讨论的数据类型,但许多现实世界的领域——从交通和日常轨迹到股票价格和能源消耗模式——产生了时间序列数据,这为合成数据生成引入了多个复杂方面。

时间序列数据按顺序结构化,观察结果根据其关联的时间戳或时间间隔按时间顺序排列。它明确包含了时间维度,允许分析随时间的趋势、季节性和其他依赖关系。

TimeGAN 是一种使用生成对抗网络(GAN)框架生成合成时间序列数据的模型,通过学习原始数据中的潜在时间依赖关系和特征:

以下是使用 Yahoo 股票价格 数据集通过 TimeGAN 合成时间序列数据的示例:

"""
    TimeGAN architecture example file
"""

# Importing necessary libraries
from os import path
from ydata_synthetic.synthesizers.timeseries import TimeSeriesSynthesizer
from ydata_synthetic.preprocessing.timeseries import processed_stock
from ydata_synthetic.synthesizers import ModelParameters, TrainParameters
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Define model parameters
gan_args = ModelParameters(batch_size=128,
                           lr=5e-4,
                           noise_dim=32,
                           layers_dim=128,
                           latent_dim=24,
                           gamma=1)

train_args = TrainParameters(epochs=50000,
                             sequence_length=24,
                             number_sequences=6)

# Read the data
stock_data = pd.read_csv("../../data/stock_data.csv")
cols = list(stock_data.columns)

# Training the TimeGAN synthesizer
if path.exists('synthesizer_stock.pkl'):
    synth = TimeSeriesSynthesizer.load('synthesizer_stock.pkl')
else:
    synth = TimeSeriesSynthesizer(modelname='timegan', model_parameters=gan_args)
    synth.fit(stock_data, train_args, num_cols=cols)
    synth.save('synthesizer_stock.pkl')

# Generating new synthetic samples
stock_data_blocks = processed_stock(path='../../data/stock_data.csv', seq_len=24)
synth_data = synth.sample(n_samples=len(stock_data_blocks))
print(synth_data[0].shape)

# Plotting some generated samples. Both Synthetic and Original data are still standartized with values between [0,1]
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(15, 10))
axes=axes.flatten()

time = list(range(1,25))
obs = np.random.randint(len(stock_data_blocks))

for j, col in enumerate(cols):
    df = pd.DataFrame({'Real': stock_data_blocks[obs][:, j],
                   'Synthetic': synth_data[obs].iloc[:, j]})
    df.plot(ax=axes[j],
            title = col,
            secondary_y='Synthetic data', style=['-', '--'])
fig.tight_layout()