import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import glob


def read_csv_columns(csv_file_path, header_names):
    df = pd.read_csv(csv_file_path)
    return df[header_names].values


def normalize(data):
    mean = np.mean(data, axis=0)
    std = np.std(data, axis=0)
    return (data - mean) / std


def save_to_csv(data, header_names, output_file):
    df = pd.DataFrame(data, columns=header_names)
    df.to_csv(output_file, index=False)


def plot_comparison_and_save(original_data, normalized_data, header_names, save_path):
    plt.figure(figsize=(14, 10))
    for i, col_name in enumerate(header_names):
        plt.plot(normalized_data[:, i], label='Normalized ' + col_name)
    plt.title('Normalization')
    plt.xlabel('Time')
    plt.ylabel('Value')
    plt.legend(loc='lower left')  # 固定图例在左下角
    plt.tight_layout()
    plt.savefig(save_path)


if __name__ == "__main__":
    input_directory = r'D:\pycharmProjects\python_server\KalManData'  # 输入目录路径
    output_csv_directory = r'D:\pycharmProjects\python_server\NormalizeData'  # 输出目录路径
    output_png_directory = r'D:\pycharmProjects\python_server\NormalizePng'  # 输出png目录路径
    columns_to_process = ['accX', 'accY', 'accZ', 'gyroX', 'gyroY', 'gyroZ', 'magX', 'magY', 'magZ']

    # 创建输出目录（如果不存在）
    if not os.path.exists(output_csv_directory):
        os.makedirs(output_csv_directory)

    if not os.path.exists(output_png_directory):
        os.makedirs(output_png_directory)

    csv_files = glob.glob(os.path.join(input_directory, '*.csv'))

    for input_csv_file in csv_files:
        file_name = os.path.basename(input_csv_file)
        output_csv_file = os.path.join(output_csv_directory, os.path.splitext(file_name)[0] + '_normalized.csv')
        output_plot_file = os.path.join(output_png_directory,
                                        os.path.splitext(file_name)[0] + '_normalization_comparison.png')

        data = read_csv_columns(input_csv_file, columns_to_process)
        normalized_data = normalize(data)

        save_to_csv(normalized_data, columns_to_process, output_csv_file)
        plot_comparison_and_save(data, normalized_data, columns_to_process, output_plot_file)
