Files
TSlib/generate_sine_data.py

103 lines
3.2 KiB
Python

import numpy as np
import pandas as pd
import os
def generate_sine_wave_data(n_samples=10000, seq_len=200, n_channels=2, save_path='./data/sine_wave/'):
"""
生成双通道正弦波时序数据
Args:
n_samples: 总样本数
seq_len: 每个序列长度
n_channels: 通道数 (固定为2)
save_path: 保存路径
"""
if not os.path.exists(save_path):
os.makedirs(save_path)
# 生成时间轴
t = np.linspace(0, 4*np.pi, seq_len)
all_data = []
for i in range(n_samples):
# 为每个样本生成不同周期和相位的正弦波
# 通道1: 随机周期和相位
freq1 = np.random.uniform(0.5, 3.0) # 频率范围
phase1 = np.random.uniform(0, 2*np.pi) # 相位
amplitude1 = np.random.uniform(0.5, 2.0) # 幅度
# 通道2: 不同的随机周期和相位
freq2 = np.random.uniform(0.3, 2.5)
phase2 = np.random.uniform(0, 2*np.pi)
amplitude2 = np.random.uniform(0.8, 1.8)
# 生成正弦波数据
channel1 = amplitude1 * np.sin(freq1 * t + phase1)
channel2 = amplitude2 * np.sin(freq2 * t + phase2)
# 添加少量噪声
# noise1 = np.random.normal(0, 0.1, seq_len)
# noise2 = np.random.normal(0, 0.1, seq_len)
#
# channel1 += noise1
# channel2 += noise2
# 组合数据: [timestamp, channel1, channel2]
timestamp = np.arange(seq_len)
sample_data = np.column_stack([timestamp, channel1, channel2])
all_data.append(sample_data)
# 转换为连续的时间序列格式
continuous_data = []
current_time = 0
for sample in all_data:
sample[:, 0] = current_time + sample[:, 0] # 调整时间戳
continuous_data.append(sample)
current_time += seq_len
# 合并所有数据
full_data = np.vstack(continuous_data)
# 创建DataFrame
df = pd.DataFrame(full_data, columns=['timestamp', 'channel1', 'channel2'])
# 按 8:1:1 比例分割训练、验证、测试集
total_len = len(df)
train_end = int(0.8 * total_len)
val_end = int(0.9 * total_len)
train_df = df[:train_end]
val_df = df[train_end:val_end]
test_df = df[val_end:]
# 保存数据
train_df.to_csv(os.path.join(save_path, 'train.csv'), index=False)
val_df.to_csv(os.path.join(save_path, 'val.csv'), index=False)
test_df.to_csv(os.path.join(save_path, 'test.csv'), index=False)
# 保存完整数据
df.to_csv(os.path.join(save_path, 'sine_wave.csv'), index=False)
print(f"数据已生成并保存到 {save_path}")
print(f"训练集: {len(train_df)} 条记录")
print(f"验证集: {len(val_df)} 条记录")
print(f"测试集: {len(test_df)} 条记录")
print(f"总计: {len(df)} 条记录,{n_channels} 个通道")
return df
if __name__ == "__main__":
# 生成数据
data = generate_sine_wave_data(
n_samples=200, # 2000个不同的正弦波样本
seq_len=200, # 每个样本200个时间点
n_channels=2, # 双通道
save_path='./data/sine_wave/'
)
print("\n数据统计信息:")
print(data.describe())