
用Python搞定东南大学齿轮箱数据集从CSV读取到特征提取的保姆级教程第一次接触东南大学齿轮箱数据集时我被那些密密麻麻的CSV文件和8个通道的振动信号搞得晕头转向。作为机械故障诊断领域的重要开源数据这个数据集包含了齿轮和轴承的多种故障类型但原始资料缺乏Python处理指南让不少初学者望而生畏。本文将带你用Pandas、NumPy和Matplotlib三大神器从零开始征服这个数据集。1. 环境准备与数据概览工欲善其事必先利其器。我们需要先搭建好Python数据分析的厨房# 安装核心库已安装可跳过 !pip install pandas numpy matplotlib seaborn scipy数据集目录结构通常如下东南大学齿轮箱数据集/ ├── bearingset/ # 轴承数据 │ ├── Ball_20_0.csv # 滚子故障-20Hz-0V │ ├── Inner_30_2.csv # 内圈故障-30Hz-2V │ └── ... └── gearset/ # 齿轮数据 ├── Chipped_20_0.csv └── ...关键特性说明采样频率5120Hz每秒钟5120个数据点8个信号通道通道1电机振动通道2-4行星齿轮x/y/z三向振动通道5电机扭矩通道6-8减速器x/y/z三向振动2. 智能读取CSV文件原始CSV文件包含配置信息和实际数据我们需要智能分割这两部分。这里我设计了一个自适应解析函数import pandas as pd import numpy as np def parse_gear_csv(filepath): 智能解析带配置头的CSV文件 with open(filepath, r, encodinggbk) as f: lines f.readlines() # 自动检测数据起始行 data_start 0 for i, line in enumerate(lines): if line.startswith(采样点) or line.replace(,, ).strip().replace(.,).isdigit(): data_start i break # 提取配置信息如有 config .join(lines[:data_start]) if data_start 0 else None # 读取数据部分 df pd.read_csv(filepath, skiprowsdata_start, headerNone if data_start0 else None) return config, df实战案例读取断齿故障数据config, data parse_gear_csv(gearset/Missing_30_2.csv) print(f配置信息\n{config[:200]}...) # 显示前200字符 data.head() # 展示前5行数据提示遇到中文编码问题时可尝试encodinggbk或utf-8。我在处理时发现部分文件使用gbk编码更稳定。3. 多维度数据可视化理解振动信号最直观的方式就是可视化。我们先看时域波形import matplotlib.pyplot as plt from scipy import signal def plot_vibration_signals(data, start0, duration0.1): 绘制多通道振动信号时域图 fs 5120 # 采样频率 samples int(fs * duration) time np.arange(samples)/fs plt.figure(figsize(12, 8)) for i in range(8): plt.subplot(4, 2, i1) plt.plot(time, data.iloc[start:startsamples, i]) plt.title(f通道{i1}) plt.xlabel(时间(s)) plt.ylabel(幅值) plt.tight_layout() plt.show()频域分析更能揭示故障特征。我们使用快速傅里叶变换(FFT)def plot_fft_analysis(data, channel0): 单通道频谱分析 fs 5120 n len(data) yf np.fft.fft(data.iloc[:, channel]) xf np.fft.fftfreq(n, 1/fs)[:n//2] plt.figure(figsize(10, 4)) plt.plot(xf, 2/n * np.abs(yf[:n//2])) plt.title(f通道{channel1}频谱分析) plt.xlabel(频率(Hz)) plt.ylabel(幅值) plt.grid() plt.show()典型故障频谱特征对比故障类型特征频率谐波表现断齿啮合频率及其倍频边带丰富内圈故障BPFI频率伴随转速频率边带外圈故障BPFO频率谐波明显4. 特征工程实战好的特征是故障诊断成功的关键。我们提取时域和频域特征4.1 时域特征提取def extract_time_features(signal): 提取18个时域特征 features { 峰值: np.max(signal), 峰峰值: np.ptp(signal), 均值: np.mean(signal), 方差: np.var(signal), RMS: np.sqrt(np.mean(signal**2)), 歪度: signal.skew(), 峭度: signal.kurtosis(), 波形因子: np.abs(signal).mean() / np.sqrt(np.mean(signal**2)), 脉冲因子: np.max(np.abs(signal)) / np.abs(signal).mean(), 裕度因子: np.max(np.abs(signal)) / (np.abs(signal).mean())**2 } return features4.2 频域特征提取def extract_freq_features(signal, fs5120): 提取频域特征 n len(signal) yf np.fft.fft(signal) xf np.fft.fftfreq(n, 1/fs)[:n//2] psd np.abs(yf[:n//2])**2 / (fs*n) features { 重心频率: np.sum(xf*psd)/np.sum(psd), 均方频率: np.sum((xf**2)*psd)/np.sum(psd), 频率方差: np.sum(((xf - features[重心频率])**2)*psd)/np.sum(psd), 频谱熵: -np.sum(psd*np.log2(psd 1e-12)) } return features4.3 批量特征提取模板def batch_extract_features(file_list): 批量处理多个CSV文件 all_features [] for file in file_list: _, data parse_gear_csv(file) file_features {文件名: file.split(/)[-1]} for ch in range(8): signal data.iloc[:, ch] prefix fCH{ch1}_ # 合并时频域特征 time_feat extract_time_features(signal) freq_feat extract_freq_features(signal.values) file_features.update({prefixk: v for k,v in time_feat.items()}) file_features.update({prefixk: v for k,v in freq_feat.items()}) all_features.append(file_features) return pd.DataFrame(all_features)5. 高级分析技巧5.1 工况分离与对比分析不同转速和负载下的故障表现差异显著# 对比同故障不同工况 def compare_conditions(fault_type): 对比同一故障在不同工况下的特征 files [ fgearset/{fault_type}_20_0.csv, fgearset/{fault_type}_30_2.csv ] features_df batch_extract_features(files) # 选取关键特征对比 key_features [CH1_RMS, CH2_峭度, CH3_频谱熵] comparison features_df[[文件名] key_features] return comparison.style.background_gradient(cmapBlues)5.2 故障类型聚类分析使用t-SNE可视化不同故障的特征分布from sklearn.manifold import TSNE from sklearn.preprocessing import StandardScaler def visualize_tsne(features_df): t-SNE降维可视化 # 标准化 X features_df.drop(columns[文件名]) X StandardScaler().fit_transform(X) # t-SNE降维 tsne TSNE(n_components2, random_state42) X_tsne tsne.fit_transform(X) # 可视化 plt.figure(figsize(10, 8)) scatter plt.scatter(X_tsne[:, 0], X_tsne[:, 1], crange(len(features_df)), cmaptab20) plt.colorbar(scatter) plt.title(故障特征t-SNE可视化) plt.xlabel(t-SNE1) plt.ylabel(t-SNE2) # 添加标签 for i, txt in enumerate(features_df[文件名]): plt.annotate(txt.split(_)[0], (X_tsne[i, 0], X_tsne[i, 1]), fontsize8, alpha0.7) plt.show()6. 实战经验分享在处理这个数据集时我总结了几条实用建议内存优化当处理大型CSV时使用pd.read_csv的chunksize参数分块读取并行计算对于批量特征提取可以用joblib.Parallel加速异常值处理某些通道可能出现异常值建议添加中值滤波预处理特征选择不是所有特征都有用建议先用方差阈值或互信息进行筛选典型问题解决方案# 解决内存不足问题示例 chunk_size 100000 features_list [] for chunk in pd.read_csv(large_file.csv, chunksizechunk_size): chunk_features extract_time_features(chunk.iloc[:, 0]) features_list.append(chunk_features) # 合并分块结果 final_features pd.concat(features_list).groupby(level0).mean()7. 扩展应用方向基于提取的特征你可以进一步探索故障分类模型使用随机森林/XGBoost区分不同故障类型健康度评估构建回归模型量化设备健康状态早期预警系统通过实时特征变化检测早期故障迁移学习应用将学到的特征迁移到其他旋转机械数据集# 简单的故障分类示例 from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split # 假设我们已经准备好了特征矩阵X和标签y X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) clf RandomForestClassifier(n_estimators100) clf.fit(X_train, y_train) print(f测试集准确率{clf.score(X_test, y_test):.2f})处理这个数据集最让我惊喜的是在齿轮断齿故障的频谱中可以清晰看到啮合频率的二次谐波幅值明显增大——这正是理论预测的典型故障特征。这种理论与实践的高度吻合让我对特征工程的价值有了更深的认识。