news 2026/6/5 10:14:12

用Python搞定PHM 2012轴承数据集:从数据下载到特征提取的保姆级教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python搞定PHM 2012轴承数据集:从数据下载到特征提取的保姆级教程

用Python搞定PHM 2012轴承数据集:从数据下载到特征提取的保姆级教程

轴承健康监测是工业设备预测性维护的核心场景之一。IEEE PHM 2012挑战赛提供的FEMTO-ST轴承数据集,已成为该领域算法验证的黄金标准。本文将手把手教你用Python生态工具链,高效完成这个经典数据集的下载、解析、可视化与时频域特征提取全流程。

1. 环境准备与数据获取

1.1 创建Python分析环境

推荐使用conda创建独立环境,避免依赖冲突:

conda create -n phm python=3.9 conda activate phm pip install numpy pandas scipy matplotlib scikit-learn tqdm

关键库版本要求:

  • Pandas ≥1.3.0(支持高效大文件读取)
  • SciPy ≥1.7.0(包含完整信号处理工具链)
  • scikit-learn ≥0.24(提供特征工程工具)

1.2 数据集下载与结构解析

原始数据包含三个目录:

  • Learning_set:训练集(6个轴承的退化过程数据)
  • Test_set:测试集(11个轴承的截断数据)
  • Full_Test_set:完整寿命测试集(3个轴承)

每个轴承数据包含:

  • 振动信号:acc_xxxxx.csv(水平/垂直双通道)
  • 温度信号:temp_xxxxx.csv(单通道)

提示:原始数据CSV文件没有表头,需手动指定列名。振动数据每列2560个点,对应0.1秒采样。

2. 高效数据加载方案

2.1 批量读取CSV文件

使用Pandas的read_csv配合多进程加速:

import pandas as pd from pathlib import Path from concurrent.futures import ProcessPoolExecutor def load_vibration(file): return pd.read_csv(file, header=None, names=['horizontal', 'vertical'], dtype=np.float32) vibration_files = list(Path('Learning_set/Bearing1_1').glob('acc_*.csv')) with ProcessPoolExecutor() as executor: vib_data = list(executor.map(load_vibration, vibration_files))

2.2 构建时间序列数据库

将分散的CSV文件整合为HDF5格式,提升后续访问效率:

import h5py with h5py.File('bearing_data.h5', 'w') as hf: for bearing in ['Bearing1_1', 'Bearing1_2']: group = hf.create_group(f'Learning_set/{bearing}') vib_data = np.stack([df.values for df in vib_dfs]) group.create_dataset('vibration', data=vib_data, compression='gzip')

3. 数据可视化与质量检查

3.1 振动信号时域分析

绘制典型时域波形及其统计特征:

import matplotlib.pyplot as plt fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 6)) ax1.plot(vib_data[100]['horizontal'], label='Horizontal') ax1.plot(vib_data[100]['vertical'], label='Vertical') ax1.set_title('Time Domain Waveform (Sample 100)') stats = pd.DataFrame({ 'RMS': vib_data.apply(lambda x: np.sqrt(np.mean(x**2))), 'Kurtosis': vib_data.apply(lambda x: pd.Series(x).kurtosis()) }) stats.plot(ax=ax2, subplots=True)

3.2 温度信号趋势分析

温度数据采样率较低(10Hz),更适合观察长期趋势:

temp_data = pd.concat([ pd.read_csv(f, header=None, names=['temperature']) for f in Path('Learning_set/Bearing1_1').glob('temp_*.csv') ], ignore_index=True) plt.figure(figsize=(12, 4)) plt.plot(np.convolve(temp_data['temperature'], np.ones(100)/100, 'valid')) plt.title('Smoothed Temperature Trend')

4. 特征工程实战

4.1 时域特征提取

计算18个经典时域指标:

from scipy.stats import kurtosis, skew def extract_time_features(x): return { 'peak': np.max(np.abs(x)), 'rms': np.sqrt(np.mean(x**2)), 'crest_factor': np.max(np.abs(x)) / np.sqrt(np.mean(x**2)), 'kurtosis': kurtosis(x), 'skewness': skew(x), # 其他13个特征... } time_features = vib_data.apply(lambda x: pd.Series( extract_time_features(x['horizontal'])))

4.2 频域特征提取

使用FFT提取频谱特征:

from scipy.fft import fft def extract_freq_features(x, fs=25600): n = len(x) yf = fft(x)[:n//2] xf = np.linspace(0, fs/2, n//2) dominant_freq = xf[np.argmax(np.abs(yf))] return { 'dominant_freq': dominant_freq, 'band_energy': [ np.sum(np.abs(yf[(xf > 500) & (xf < 1000)])**2), # 其他频带... ] } freq_features = vib_data.iloc[:100].apply( lambda x: pd.Series(extract_freq_features(x['vertical'])))

4.3 特征选择与可视化

使用随机森林评估特征重要性:

from sklearn.ensemble import RandomForestRegressor model = RandomForestRegressor() model.fit(features, labels) # labels为RUL数据 pd.Series(model.feature_importances_, index=features.columns).sort_values().plot.barh()

5. 工程化实践技巧

5.1 构建特征计算流水线

使用sklearn的Pipeline实现自动化:

from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer feature_pipe = Pipeline([ ('time_features', FunctionTransformer(extract_time_features)), ('freq_features', FunctionTransformer(extract_freq_features)), ('scaler', StandardScaler()) ]) X_transformed = feature_pipe.fit_transform(raw_data)

5.2 内存优化策略

对于大型数据集,建议采用分块处理:

chunk_size = 1000 features = [] for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size): chunk_features = extract_features(chunk) features.append(chunk_features) final_features = pd.concat(features)

5.3 可复现性保障

使用Jupyter Notebook的魔法命令记录环境状态:

%load_ext watermark %watermark -iv -v -m -g

保存关键参数到JSON配置文件:

import json config = { "sampling_rate": 25600, "feature_params": {...} } with open('config.json', 'w') as f: json.dump(config, f)

6. 性能对比:Python vs Matlab方案

6.1 开发效率对比

操作Python方案Matlab方案
批量文件读取3行代码+并行加速需自定义文件遍历逻辑
特征计算内置向量化运算依赖循环实现
可视化Matplotlib+Seaborn丰富样式基础绘图功能

6.2 执行效率测试

对同一轴承的100个振动文件处理耗时:

%%timeit # Python方案 features = vib_data.apply(extract_features) # 平均耗时:2.3s ± 120ms

等效Matlab代码平均耗时:3.8s(在相同硬件配置下)

6.3 生态扩展性分析

Python优势领域:

  • 机器学习(scikit-learn, TensorFlow)
  • 大数据处理(Dask, PySpark)
  • Web部署(Flask, FastAPI)

7. 故障诊断实战案例

以Bearing1_3的振动数据为例,演示早期故障检测:

# 计算滚动均方根 rms_window = 100 rolling_rms = vib_data['horizontal'].pow(2).rolling(rms_window).mean().sqrt() # 检测突变点 from ruptures import Pelt algo = Pelt(model="rbf").fit(rolling_rms.values) change_points = algo.predict(pen=10) # 可视化结果 plt.figure(figsize=(12,4)) plt.plot(rolling_rms) for cp in change_points: plt.axvline(cp, color='red', linestyle='--')

8. 高级技巧:实时监控系统原型

使用PyQt构建简易监控界面:

from PyQt5.QtWidgets import QApplication, QMainWindow from matplotlib.backends.backend_qt5agg import FigureCanvas class MonitorWindow(QMainWindow): def __init__(self): super().__init__() self.figure = plt.Figure() self.canvas = FigureCanvas(self.figure) self.setCentralWidget(self.canvas) # 定时更新数据 self.timer = QTimer() self.timer.timeout.connect(self.update_plot) self.timer.start(1000) # 1秒刷新 def update_plot(self): self.figure.clear() ax = self.figure.add_subplot(111) latest_data = get_latest_vibration() ax.plot(latest_data) self.canvas.draw()

9. 常见问题解决方案

9.1 内存不足处理

对于大型振动数据文件:

  • 使用dask.dataframe替代Pandas
  • 降低采样率(如从25.6kHz降到6.4kHz)
  • 转换为稀疏格式存储
import dask.dataframe as dd ddf = dd.read_csv('large_acc_*.csv', blocksize='256MB')

9.2 特征标准化技巧

不同量纲特征的标准化方法选择:

特征类型推荐方法说明
振动幅值RobustScaler抗异常值影响
频率成分MinMaxScaler(0,1)保持比例关系
温度相关StandardScaler符合正态分布假设

9.3 跨平台协作建议

团队协作推荐工具链:

  • 数据版本控制:DVC(Data Version Control)
  • 文档协作:Jupyter Notebook → Jupyter Book
  • 自动化测试:pytest + GitHub Actions

10. 扩展应用方向

基于本数据集的进阶研究思路:

  1. 深度学习方法

    • 使用1D CNN处理原始振动信号
    • 基于LSTM的剩余寿命预测
    • 生成对抗网络(GAN)扩充数据
  2. 融合多传感器数据

    • 振动+温度+声发射多模态融合
    • 注意力机制特征加权
  3. 边缘计算部署

    • 使用ONNX转换模型
    • 在树莓派上实现实时监测
# 示例:1D CNN模型架构 from tensorflow.keras import layers model = Sequential([ layers.Conv1D(64, 3, activation='relu', input_shape=(2560, 1)), layers.MaxPooling1D(2), layers.Flatten(), layers.Dense(1) ])

11. 资源推荐

11.1 扩展数据集

  • NASA轴承数据集(更丰富的故障类型)
  • IMS轴承数据集(更长寿命周期)
  • CWRU轴承数据集(多种负载条件)

11.2 实用工具库

  • tsfresh:自动化特征工程
  • pyts:时间序列分类工具
  • luminaire:异常检测专用库

11.3 学习资料

  • 《Python时间序列分析实战》
  • IEEE PHM会议最新论文集
  • scikit-learn官方文档案例

12. 持续改进建议

在实际项目中,我们发现以下优化方向效果显著:

  1. 采样策略优化
    原始数据每10秒采集0.1秒,可能遗漏关键事件。建议:

    • 关键阶段提高采样密度
    • 触发式采集(当RMS超过阈值时)
  2. 特征存储方案
    将提取的特征存入时序数据库(如InfluxDB),便于:

    • 长期趋势分析
    • 多设备对比
    • 快速检索特定工况数据
  3. 自动化报告生成
    使用Jinja2模板自动生成分析报告:

from jinja2 import Template report_template = Template(''' # Bearing Health Report ## Key Metrics - Current RMS: {{ current_rms }} - Predicted RUL: {{ rul }} hours ''') report = report_template.render( current_rms=last_rms_value, rul=model.predict(last_features) )
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 10:13:23

这10款内网穿透工具,一定有你没用过的

【收藏必备】10款内网穿透工具详解&#xff1a;从零基础到精通&#xff0c;网络安全入门到实战 本文详细介绍10款内网穿透工具&#xff0c;从基础概念到实际应用全面解析。涵盖FRP、Ngrok、OpenVPN等免费开源及国产工具&#xff0c;支持多种协议与场景。无论是远程控制设备、暴…

作者头像 李华
网站建设 2026/6/5 10:11:43

文档自动化流水线:模板驱动+结构化内容一键生成

1. 这不是“套模板”&#xff0c;而是把文档生产变成流水线作业你有没有过这种体验&#xff1a;客户刚确认需求&#xff0c;你立刻打开Word新建文档&#xff0c;手动调整页眉页脚、插入公司Logo、复制粘贴产品参数表、反复核对字体字号、导出PDF前还要检查三遍目录是否自动生成…

作者头像 李华
网站建设 2026/6/5 10:09:04

@ControllerAdvice

ControllerAdvice 是 Spring MVC 中的一个全局增强组件。它的作用可以理解为&#xff1a;给所有 Controller 或RestController 统一增加公共能力。最常见的用途&#xff1a;1. 全局异常处理 2. 全局数据绑定 3. 全局参数预处理 4. 全局返回值封装面试中经常问&#xff1a;Sprin…

作者头像 李华
网站建设 2026/6/5 10:06:58

Copilot时代的程序员:这5个能力比写代码更重要

Copilot时代的程序员&#xff1a;这5个能力比写代码更重要凌晨两点&#xff0c;你盯着屏幕上AI生成的一段"看似正确但运行就报错"的代码&#xff0c;陷入了沉思。 这不是段子。这是过去一年里&#xff0c;无数程序员真实的工作状态。 当GitHub Copilot成为默认的编程…

作者头像 李华