- 第1篇 -
这期将开始Python学习分享专栏,不过更多的是结合公开数据集展开,为后面实战编写故障诊断程序做准备。
正文
CWRU数据集是mat文件(matlab数据文件格式),那如何用python读取数据呢?图1为文件夹位置
图1 文件夹位置
如图1所示,我想读取'F:/故障数据集/CWRU/12DriveEndFault/1730/0.007-Ball.mat',该怎么读取呢?
这里就需要用到scipy包
import scipy.io as scio #导入scio包中io子包,并重命名为scio
filepath = r'F:/故障数据集/CWRU/12DriveEndFault/1730/0.007-Ball.mat' #文件夹路径
data = scio.loadmat(file_path) # 通过loadmat函数加载mat文件
print(data)
>>>结果
从结果可以发现这是{}包起来的,因此是一个字典类型,那这不就又到python熟悉的数据类型了嘛。字典是由键和值组成的(key-value),红框圈住的就是键。通过观察其键,我们所要的振动数据应该在'X108_DE_time'(),'X108_FE_time'()和'X108_BA_time'中。这分别为Drive End,FanEnd,Baseline放置的传感器获取的数据,而故障轴承放在Drive end,故'X108_DE_time'()对应的数据更靠近真实数据,从而噪声数据更小,故障信号更明显。
下面获取该字典的所有键
# mat文件为字典类型,获取字典所有的键并转换为list类型
data_key_list = list(data.keys())
print(data_key_list)
>>>结果
['__header__', '__version__', '__globals__', 'X108_DE_time',
'X108_FE_time', 'X108_BA_time', 'X108RPM']
结果是和红框所圈的键是对应的
下面就开始获取'X108_DE_time'()所对应的值
accl_key = data_key_list[3] # 获取'X108_DE_time'
accl_data = data[accl_key] # 获取'X108_DE_time'所对应的值,即为振动加速度信号
print(accl_data)
>>>结果
[[ 0.22269856]
[ 0.09323776]
[-0.14651649]
...
[-0.36125573]
[ 0.31138814]
[ 0.17055689]]
终于看到加速度值了,但问题又来了,结果是个二维数组,我们习惯操作的是一维数组,该怎么办呢,这时候flatten函数要出手了。
用flatten函数将二维数组转为一维数组
accl_data = accl_data.flatten() #将二维数组展开成一维数组
print(accl_data)
>>>结果
[ 0.22269856 0.09323776 -0.14651649 ... -0.36125573 0.31138814
0.17055689]
数据获取终于大功告成了,接下来通过绘图展示一下
import matplotlib.pyplot as plt # 导入绘图函数
import numpy as np # 导入numpy库
fs = 12000 # 采样率为12k
data_len = len(accl_data) # 获取数据长度
t = data_len/fs # 计算采样时间 (采样时间 )= (数据长度)/(采样率)
x = np.linspace(0,t,data_len) # 划分x轴的数据,其长度应为数据长度
plt.figure(figsize=(20,5)) #设置绘图大小
plt.xlabel('t', fontsize=18) #设置x轴标签名字为‘t’,设置其大小为18
plt.ylabel('accleration data', fontsize=18) #设置y轴标签名字为‘accleration data’,设置其大小为18
plt.title('12k-DriveEndFault-1730-0.007-Ball',fontsize=18) #设置标题
plt.plot(x, accl_data) # 绘图
>>>结果
完整程序如下,将数据获取写成一个函数,只需传入FilePath参数,就可返回所需数组。
import scipy.io as scio #导入scipy包
import numpy as np # 导入numpy库## 定义数据获取函数 ##
def DataAcquision(FilePath):
data = scio.loadmat(file_path) # 加载mat数据
data_key_list = list(data.keys()) # mat文件为字典类型,获取字典所有的键并转换为list类型
accl_key = data_key_list[3] # 获取'DE_time'
accl_data = data[accl_key].flatten() # 获取'X108_DE_time'所对应的值,即为振动加速度信号,并将二维数组展成一维数组
return accl_data
FilePath = r'F:/故障数据集/CWRU/12DriveEndFault/1730/0.007-InnerRace.mat' #文件夹路径
accl_data = DataAcquision(FilePath)
fs = 12000 # 采样率为12k
data_len = len(accl_data) # 获取数据长度
t = data_len/fs # 计算采样时间 (采样时间 )= (数据长度)/(采样率)
x = np.linspace(0,t,data_len) # 划分x轴的数据,其长度应为数据长度
plt.figure(figsize=(20,5)) #设置绘图大小
plt.xlabel('t', fontsize=18) #设置x轴标签名字为‘t’,设置其大小为18
plt.ylabel('accleration data', fontsize=18) #设置y轴标签名字为‘accleration data’,设置其大小为18
plt.title('12k-DriveEndFault-1730-0.007-InnerRace',fontsize=18) #设置标题
plt.plot(x, accl_data) # 绘图
>>>结果
课后作业
在DataAqusition函数中,获取的字典类型键固定为第4个了,也就是说获取的数据都是放置在DriveEnd传感器的数据,比如故障轴承放置在FanEnd,就不太适合了。
请发挥你的小脑袋,解决通过判断故障轴承位置,自适应获取键的位置。
作者:小平
如需转载,请后台联系作者