IEEE_PHM_2012数据可视化

1、查看文件

import os
import pandas as pd

# 指定包含 CSV 文件的目录路径
directory = 'D:\剩余寿命预测RUL\IEEE_PHM_2012_Data\Learning_set\Bearing1_1'  # 替换文件路径

# 获取目录下所有 CSV 文件的文件名
csv_files = [f for f in os.listdir(directory) if f.endswith('.csv')]

# 统计Bearing1_1目录下的文件数量
num_files = len(csv_files)
print(f"Bearing1_1目录下有 {num_files} 个文件")

# 计算轴承的总寿命
total_life_seconds = num_files * 10
print(f"轴承的总寿命为:{total_life_seconds} 秒")

# 逐个读取 CSV 文件并输出其形状
for file in csv_files:
    file_path = os.path.join(directory, file)
    df = pd.read_csv(file_path)
    # print(f'{file} 的形状是: {df.shape}')
    print(df.shape)

结果如图:

2、查看单个文件数据并可视化

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

# 读取数据
file_path = r"D:\剩余寿命预测RUL\IEEE_PHM_2012_Data\Learning_set\Bearing1_1\acc_00001.csv"
original_data = pd.read_csv(file_path, header=None)

# 设定字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 标题使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 分别提取 5 和 6 列数据,然后绘制其时域图形
plt.figure(figsize=(18, 5))

plt.subplot(121)
plt.plot(original_data.iloc[:, -2], color='#2632cd')
plt.title('水平振动信号', fontdict={'family': 'SimSun', 'size': 14})  # 宋体标题
plt.xlabel("时间 (s)", fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])  # Times New Roman
plt.ylabel("振动幅值 (m/s²)", fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.xticks(fontname="Times New Roman")  # 刻度值
plt.yticks(fontname="Times New Roman")

plt.subplot(122)
plt.plot(original_data.iloc[:, -1], color='#2632cd')
plt.title('竖直振动信号', fontdict={'family': 'SimSun', 'size': 14})
plt.xlabel("时间 (s)", fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.ylabel("振动幅值 (m/s²)", fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.xticks(fontname="Times New Roman")
plt.yticks(fontname="Times New Roman")

plt.show()

结果如图:

3、单个全寿命数据可视化

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

# 设置全局刻度字体
plt.rcParams['font.family'] = 'Times New Roman'

# 定义文件夹路径
file_path = r'D:\剩余寿命预测RUL\IEEE_PHM_2012_Data\Full_Test_Set\Bearing1_5'

# %% 全寿命振动信号
csv_acc_path_list = glob.glob(os.path.join(file_path, 'acc*.csv'))
csv_acc_num = len(csv_acc_path_list)

if csv_acc_num > 0:
    csv_acc_data_list = []
    for j in range(csv_acc_num):
        csv_acc_name = csv_acc_path_list[j]
        csv_acc = np.loadtxt(csv_acc_name, delimiter=',')
        csv_acc_data_list.append(csv_acc)
        print(f'{csv_acc_num} {j+1} {csv_acc_name}')
    csv_acc_data = np.vstack(csv_acc_data_list)

# %% 全寿命温度信号
csv_temp_path_list = glob.glob(os.path.join(file_path, 'temp*.csv'))
csv_temp_num = len(csv_temp_path_list)

if csv_temp_num > 0:
    csv_temp_data_list = []
    for j in range(csv_temp_num):
        csv_temp_name = csv_temp_path_list[j]
        with open(csv_temp_name, 'r') as f:
            lines = f.readlines()
            data = []
            for line in lines:
                numbers = line.strip().split(';')
                data.append([float(num) for num in numbers])
            csv_temp_data_list.append(np.array(data))
        print(f'{csv_temp_num} {j+1} {csv_temp_name}')
    csv_temp_data = np.vstack(csv_temp_data_list)

# %% 绘制全寿命振动信号和温度信号的时域图
plt.figure(figsize=(10, 8))
plt.subplot(211)
plt.plot(csv_acc_data[:, 4], color='#2632cd')
plt.title('水平振动信号', fontdict={'family': 'SimSun', 'size': 14})
# 设置X轴和Y轴标签,其中中文用宋体,单位用Times New Roman
plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12})
plt.ylabel(r'振动幅值 (m/s²)', fontdict={'family': 'SimSun', 'size': 12})
plt.xticks(fontname='Times New Roman')  # 设置 X 轴刻度字体
plt.yticks(fontname='Times New Roman')  # 设置 Y 轴刻度字体

plt.subplot(212)
plt.plot(csv_acc_data[:, 5], color='#2632cd')
plt.title('竖直振动信号', fontdict={'family': 'SimSun', 'size': 14})
plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.ylabel(r'振动幅值 (m/s²)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.xticks(fontname='Times New Roman')
plt.yticks(fontname='Times New Roman')

plt.tight_layout()

# 温度信号图
plt.figure(figsize=(10, 6))
plt.plot(csv_temp_data[:, 4], color='#2632cd')
plt.title('温度信号', fontdict={'family': 'SimSun', 'size': 14})
# 设置X轴和Y轴标签,其中中文用宋体,单位用Times New Roman
plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.ylabel(r'温度 (°C)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
plt.xticks(fontname='Times New Roman')
plt.yticks(fontname='Times New Roman')
family=["Times New Roman", "SimSun"]
plt.show()

结果如下:

4、遍历全寿命数据可视化

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

# 设置全局刻度字体
plt.rcParams['font.family'] = 'Times New Roman'

# 定义基础路径
base_path = r'D:\剩余寿命预测RUL\IEEE_PHM_2012_Data\Full_Test_Set'
save_base_path = r'D:\剩余寿命预测RUL\IEEE_PHM_2012_Data'
save_path = os.path.join(save_base_path, 'Vibration and Temperature Figure')

# 如果保存路径不存在,则创建
if not os.path.exists(save_path):
    os.makedirs(save_path)

# 获取所有Bearing文件夹
bearing_folders = glob.glob(os.path.join(base_path, 'Bearing*'))

# 定义检测分隔符的函数
def detect_delimiter(file_path):
    with open(file_path, 'r') as f:
        first_line = f.readline().strip()
    if ';' in first_line:
        return ';'
    elif ',' in first_line:
        return ','
    else:
        raise ValueError(f"无法识别文件 {file_path} 的分隔符")

# 处理每个Bearing文件夹
for folder in bearing_folders:
    bearing_name = os.path.basename(folder)
    print(f"Processing {bearing_name}...")

    # 处理振动信号
    csv_acc_path_list = glob.glob(os.path.join(folder, 'acc*.csv'))
    csv_acc_num = len(csv_acc_path_list)

    if csv_acc_num > 0:
        csv_acc_data_list = []
        for j in range(csv_acc_num):
            csv_acc_name = csv_acc_path_list[j]
            # 检测文件的分隔符
            delimiter = detect_delimiter(csv_acc_name)
            print(f'振动文件 {csv_acc_name} 使用分隔符: {delimiter}')
            # 使用检测到的分隔符加载数据
            csv_acc = np.loadtxt(csv_acc_name, delimiter=delimiter)
            csv_acc_data_list.append(csv_acc)
            print(f'Vibration: {csv_acc_num} {j + 1} {csv_acc_name}')
        csv_acc_data = np.vstack(csv_acc_data_list)

        # 绘制振动信号图
        plt.figure(figsize=(10, 8))
        plt.subplot(211)
        plt.plot(csv_acc_data[:, 4], color='#2632cd')
        plt.title(f'{bearing_name}水平振动信号', fontdict={'family': 'SimSun', 'size': 14}, family=["Times New Roman", "SimSun"])
        plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
        plt.ylabel(r'振动幅值 (m/s²)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
        plt.xticks(fontname='Times New Roman')
        plt.yticks(fontname='Times New Roman')

        plt.subplot(212)
        plt.plot(csv_acc_data[:, 5], color='#2632cd')
        plt.title(f'{bearing_name}竖直振动信号', fontdict={'family': 'SimSun', 'size': 14}, family=["Times New Roman", "SimSun"])
        plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
        plt.ylabel(r'振动幅值 (m/s²)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
        plt.xticks(fontname='Times New Roman')
        plt.yticks(fontname='Times New Roman')

        plt.tight_layout()
        # 保存振动信号图
        plt.savefig(os.path.join(save_path, f'{bearing_name}_vibration.png'), dpi=600, bbox_inches='tight')
        plt.savefig(os.path.join(save_path, f'{bearing_name}_vibration.svg'), dpi=600, bbox_inches='tight')  # 保存为SVG
        plt.close()

    # 处理温度信号
    csv_temp_path_list = glob.glob(os.path.join(folder, 'temp*.csv'))
    csv_temp_num = len(csv_temp_path_list)

    if csv_temp_num > 0:
        csv_temp_data_list = []
        for j in range(csv_temp_num):
            csv_temp_name = csv_temp_path_list[j]
            # 检测文件的分隔符
            delimiter = detect_delimiter(csv_temp_name)
            print(f'温度文件 {csv_temp_name} 使用分隔符: {delimiter}')
            # 使用检测到的分隔符加载数据,提取最后一列(温度)
            csv_temp = np.loadtxt(csv_temp_name, delimiter=delimiter, usecols=(-1,))
            csv_temp_data_list.append(csv_temp)
            print(f'Temperature: {csv_temp_num} {j + 1} {csv_temp_name}')
        csv_temp_data = np.hstack(csv_temp_data_list)  # 合并所有文件中的数据

        # 绘制温度信号图
        plt.figure(figsize=(10, 6))
        plt.plot(csv_temp_data, color='#2632cd')  # 绘制温度信号
        plt.title(f'{bearing_name}温度信号', fontdict={'family': 'SimSun', 'size': 14}, family=["Times New Roman", "SimSun"])
        plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
        plt.ylabel(r'温度 (°C)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
        plt.xticks(fontname='Times New Roman')
        plt.yticks(fontname='Times New Roman')

        # 保存温度信号图
        plt.savefig(os.path.join(save_path, f'{bearing_name}_temperature.png'), dpi=600, bbox_inches='tight')
        plt.savefig(os.path.join(save_path, f'{bearing_name}_temperature.svg'), dpi=600, bbox_inches='tight')  # 保存为SVG
        plt.close()

print("所有图像处理完成!")

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值