# -*- coding: utf-8 -*-
"""
Created on Wed Jan 23 09:11:55 2019
@author: baishuhua
"""
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus']=False
import os
import glob
from scipy import interpolate
import DwtFeatureExtraction
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split,cross_val_score,GridSearchCV
import time
import sys;sys.path.append('E:\\大数据')
import sampler
from collections import Counter
'''
# ********** 第一阶段:原始数据展示及预处理 **********
'''
# 读文本数据,返回Time,Signals,其中Signals按列依次代表一次侧三相电流和二次侧三相电流
def ReadData_Text(file):
Time = []
Signals = []
with open(file) as f:
for line in f:
Attr = line.strip().split(' ')
Content = list(map(float, Attr))
Time.append(Content[0])
Signals.append(Content[1:])
return np.array(Time), np.array(Signals)
def WaveForm_Cut(t, y, before=0.04, after=0.2):
y_abs = np.abs(y)
x_peak = np.argmax(y_abs, axis=0)
left,right = min(x_peak[:3]),max(x_peak[:3])
interval = np.logical_and(t>=(t[left]-before), t<=(t[right]+after))
return t[interval], y[interval,:]
# 展示原始波形数据
def ViewWaveform_TimeDomain(t, y, issave=True, name=''):
fig,axes = plt.subplots(figsize=(10,6), nrows=2, ncols=2, sharex=True)
axes[0,0].plot(t, y[:,:3]);axes[0,0].legend(['Ia','Ib','Ic']);axes[0,0].set_ylabel('一次侧')
axes[0,1].plot(t, y[:,:3]-y[:,[1,2,0]]);axes[0,1].legend(['Iab','Ibc','Ica'])
axes[1,0].plot(t, y[:,3:]);axes[1,0].legend(['Ia','Ib','Ic']);axes[1,0].set_ylabel('二次侧')
axes[1,1].plot(t, y[:,3:]-y[:,[-1,-2,-3]]);axes[1,1].legend(['Iab','Ibc','Ica'])
# plt.xlim([0.0,0.6])
plt.suptitle(os.path.basename(name))
if issave:
plt.savefig(name)
plt.close()
# 数据预处理,插值成固定采样率的时间序列
def Interp(x, y, delta=1/1000, kind='slinear', axis=0): # delta为相邻自变量的间隔
# 沿axis轴拟合x,y,因变量y沿axis维度应等于x维度
function=interpolate.interp1d(x, y, kind, axis)
x_new = np.arange(min(x), max(x)-delta, step=delta)
y_new = function(x_new)
return x_new, y_new
# 现场录波读取,注意数据书写格式,前三行电压电流通道信息,后变采样率信息
def ReadFaultRecord(file): # 读取录波数据
ReadFlag=open(file)
ReadFlag.readline();ReadFlag.readline();ReadFlag.readline()
segnum=ReadFlag.readline().strip().split(':')[1]
Time=[]
for seg in range(int(segnum)):
SampleAttr=ReadFlag.readline().strip().split(' ')
[fs,start,terminal]=list(map(int,map(float,SampleAttr)))
if len(Time)<1:
Time.extend(1/fs*(np.linspace(1,terminal-start+1,num=terminal-start+1)))
else:
Time.extend(Time[-1]+1.0/fs*(np.linspace(1,terminal-start+1,num=terminal-start+1)))
ReadFlag.readline();ReadFlag.readline() # 跳过故障相信息
SignalNames=ReadFlag.readline().strip().split(' ')
SignalNames=[name for name in SignalNames if name!='']
Data=[];ValidIndex=[];row=0
for record in ReadFlag:
detail=record.strip().split(' ')
if len(detail)==len(SignalNames):
try:
Data.append(list(map(float,detail)))
ValidIndex.append(row)
row=row+1
except ValueError:
row=row+1
else:
row=row+1
continue
ReadFlag.close()
ValidIndex=np.array(ValidIndex)
rows=ValidIndex[ValidIndex<len(Time)]
Time=np.array(Time);Time=Time[rows];Data=np.array(Data);Data=Data[rows];
return Time,Data
# 动模试验仿真,注意数据书写格式,先变采样率信息,后所有模拟通道
def ReadSimuRecord(file): # 读取仿真数据
ReadFlag=open(file)
segnum=ReadFlag.readline().strip().split(':')[1]
Time=[]
for seg in range(int(segnum)):
SampleAttr=ReadFlag.readline().strip().split(' ')
[fs,start,terminal]=list(map(int,map(float,SampleAttr)))
if len(Time)<1:
Time.extend(1/fs*(np.linspace(1,terminal-start+1,num=terminal-start+1)))
else:
Time.extend(Time[-1]+1.0/fs*(np.linspace(1,terminal-start+1,num=terminal-start+1)))
SignalNames=ReadFlag.readline().strip().split(' ')
SignalNames=[name for name in SignalNames if name!='']
SignalNames=SignalNames[:41]
Data=[];ValidIndex=[];row=0
for record in ReadFlag:
detail=record.strip().split(' ')
detail=[value for value in detail if value!='']
if len(detail)==len(SignalNames):
try:
Data.append(list(map(float,detail)))
ValidIndex.append(row)
row=row+1
except ValueError:
row=row+1
else:
row=row+1
continue
ReadFlag.close()
ValidIndex=np.array(ValidIndex)
rows=ValidIndex[ValidIndex<len(Time)]
Time=np.array(Time);Time=Time[rows];Data=np.array(Data);Data=Data[rows];
return Time,Data
'''
# ********** 第二阶段:特征工程,生成特征集和类别标签 **********
'''
# 特征提取
def ExtractFeature(file):
time, signals = ReadData_Text(file)
time_new, signals_new = Interp(time, signals)
signals_input = signals_new - signals_new[:,[1,2,0,4,5,3]] # 差流信号
names_input = ['Iab1','Ibc1','Ica1','Iab2','Ibc2','Ica2'] # 1,2代表一,二次侧
featurename = [];featurevalue = []
for col in range(np.shape(signals_new)[-1]):
sample = signals_input[:,col]
# ********** DWT小波变换域特征提取 ********** #
wavelet = 'bior3.5';level = 4
coeffs = DwtFeatureExtraction.DwtRec(sample, wavelet=wavelet, level=level)
name,value = DwtFeatureExtraction.FeatureExtractDwt(coeffs)
# 每个特征名添加对待处理物理量的描述
name_new = list(map(lambda x:names_input[col]+'-'+x,name))
featurename.extend(name_new)
featurevalue.extend(value)
featurename=np.array(featurename);featurevalue=np.array(featurevalue)
return featurename, featurevalue
# 特征样本集生成,并将其保存至文件中
def ExtractFeatures_AllFiles(FilePath, SavePath, filename='Features.csv'):
print('Start extracting features ...\n')
BigFeatures = [];BigSamplenames = [];BigLabels = []
SaveFile = os.path.join(SavePath, filename)
import csv
file_object = open(SaveFile, 'w', newline='')
writer=csv.writer(file_object)
FileLists = glob.glob(FilePath, recursive=True)
FileNums=len(FileLists)
for fileNo,file in enumerate(FileLists, start=1):
try:
featurename, featurevalue=ExtractFeature(file)
filename=os.path.basename(file)
attr=filename.split('_')[0]
BigFeatures.append(featurevalue) # 特征矩阵
BigSamplenames.append(file) # 样本名列表
BigLabels.append(attr) # 标签列表
except:
continue
if fileNo == 1:
head = np.concatenate((np.array(['Filename','Label']), featurename))
writer.writerow(head)
line=np.concatenate((np.array([filename,attr]), featurevalue))
writer.writerow(line)
if fileNo%1000 == 0 & fileNo != FileNums:
print('Completed {0} %'.format(round(fileNo/FileNums*100,4)))
elif fileNo == FileNums:
print('Finish extracting features!!!')
BigFeatures = np.array(BigFeatures)
BigSamplenames = np.array(BigSamplenames)
BigLabels = np.array(BigLabels)
file_object.close()
return BigSamplenames,
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
变压器涌流和内部故障仿真-Simulink.zip (41个子文件)
Transformer-Simulink-0b06559482a1b43e32835333d9c6fab8fd0039a8
InternalFaults_Lead_Delta11Delta11.slx 23KB
InternalFaults_Lead_YDelta1.slx 23KB
InternalFaults_Lead_YDelta11.slx 23KB
InternalFaults_Lead_YgYg.slx 23KB
InternalFaults_Winding_Delta11Delta1.slx 25KB
InternalFaults_Winding_Delta11Y.slx 25KB
InternalFaults_Winding_Delta1Yg.slx 25KB
SympatheticCurrent_Parallel.slx 25KB
InternalFaults_Lead_YgY.slx 23KB
InternalFaults_Winding_Delta1Delta11.slx 25KB
InternalFaults_Lead_Delta11Y.slx 23KB
InternalFaults_Lead_Delta11Delta1.slx 23KB
InternalFaults_Winding_YDelta11.slx 25KB
InternalFaults_Winding_Delta11Yg.slx 25KB
SympatheticCurrent_Series.slx 24KB
ExciterFlowCurrent_NoLoadSwitch.slx 22KB
InternalFaults_Winding_YgYg.slx 25KB
InternalFaults_Winding_Delta11Delta11.slx 25KB
InternalFaults_Winding_YgDelta1.slx 25KB
InternalFaults_Lead_Delta1Delta11.slx 23KB
InternalFaults_Winding_YgY.slx 25KB
InternalFaults_Lead_YgDelta1.slx 23KB
InternalFaults_Winding_Delta1Y.slx 25KB
sampler.py 8KB
InternalFaults_Winding_YDelta1.slx 25KB
InternalFaults_Lead_Delta1Y.slx 23KB
InternalFaults_Lead_YY.slx 23KB
InternalFaults_Lead_Delta1Delta1.slx 23KB
RecoveryCurrent_ExternalFault.slx 25KB
InternalFaults_Winding_Delta1Delta1.slx 25KB
InternalFaults_Lead_YYg.slx 23KB
Classification_InrushCurrent_InternalFault.py 33KB
InternalFaults_Lead_Delta1Yg.slx 23KB
Features_Inrush_Fault_Cut.csv 10.4MB
InternalFaults_Winding_YYg.slx 25KB
InternalFaults_Winding_YgDelta11.slx 25KB
InternalFaults_Lead_Delta11Yg.slx 23KB
InternalFaults_Winding_YY.slx 25KB
InternalFaults_Lead_YgDelta11.slx 23KB
DwtFeatureExtraction.py 15KB
Restore.m 66KB
共 41 条
- 1
资源评论
我悟了-
- 粉丝: 2150
- 资源: 133
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功