首页/文章/ 详情

Python学习|第1篇

1年前浏览371
     

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.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,就不太适合了。

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

  作者:小平

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

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

来源:故障诊断与python学习
振动python
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-22
最近编辑:1年前
故障诊断与python学习
硕士 签名征集中
获赞 69粉丝 66文章 141课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈