首页/文章/ 详情

Python学习|第1篇

10月前浏览228
     

Python学习

- 第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.222698560.09323776-0.14651649 ... -0.361255730.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库
## 定义数据获取函数  ##
defDataAcquision(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,就不太适合了。

请发挥你的小脑袋,解决通过判断故障轴承位置,自适应获取键的位置。

作者:小平

如需转载,请后台联系作者

说明:部分图片来源网络,若有侵权,烦请联系处理

来源:故障诊断与python学习
振动python
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-22
最近编辑:10月前
故障诊断与python学习
硕士 签名征集中
获赞 42粉丝 33文章 81课程 0
点赞
收藏
未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈