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())
