针对刀具磨损的日志读取的曲线分析(一维高斯滤波及波形拟合)


```python
#-*-coding:gbk-*-
import matplotlib.pyplot as plt
import numpy as np
import os 
import chardet
def kernels(kernel_num):              #高斯滤波内核设置
    a=np.arange(kernel_num)+1
    for num in range((len(a)-1)//2):
        a[-(num+1)]=a[num]
    b= a.reshape(1,-1) 
    ave=np.sum(b)
    #print(b)
    return b,ave
def datacreate(name):
    print('find ',name)
    path='./'+name
    f = open(path,'rb')  # 先用二进制打开
    data = f.read()  # 读取文件内容
    file_encoding = chardet.detect(data).get('encoding')  # 得到文件的编码格式
    input1 = open(path,'r', encoding=file_encoding)   #读取文件
    source = input1.read()
    source_list=source.split('\n')    #每行分割
    time_list=[]                          
    process_list=[]
    mean_list=[]
    max_list=[]
    print('initialize.....')
    for line in source_list:                     
        if '刀具异常磨损均值判断' not in line:            #识别存在平均值的行
            continue
        time=line.split('[')
        #print(time)
        time=time[1].split(']')
        time_hour=time[0][6:8]+'--'+time[0][12:17]       #时间
        time_list.append(time_hour)
        process_num=time[1].split('样本子程序号')
        process_num=process_num[1].split(' ')           #程序号
        process_list.append(process_num[0])
        mean_num=process_num[-1].split('当前均值')
        mean_list.append(mean_num[-1])                     #均值
        max_num=process_num[-3].split('样本上限均值')
        max_list.append(max_num[-1])
        #print(max_num[-1],mean_num[-1])
    var_process=sorted(list(set(process_list)))        #去除重复值和排序
    if '2007' in var_process:
        var_process.remove('2007')
    if '7300' in var_process:                       #去除无效的波形
        var_process.remove('7300')
    plt.figure(figsize=(20,90))
    sum_process=len(var_process)             #看看有几个图
    for i,process in enumerate(var_process):
        mean_sums=[]
        time_display=[]
        for k,process_num in enumerate((process_list)):
            if process == process_num:
                mean_sums.append(mean_list[k])              #提取对的程序号的值
                time_display.append(time_list[k])           #同理,提取时间
                max_num=max_list[k]
        ax=plt.subplot(sum_process,1,i+1)
        #ax.plot([10,len(mean_sums)-10],[float(max_num),float(max_num)], color="red")
        #plt.plot([10,len(mean_sums)-10],[np.array(mean_sums,dtype=float).max(),np.array(mean_sums,dtype=float).max()], color="red")
        orign_data=np.array(mean_sums,dtype=float)  
        new_data=orign_data.copy()
        kernel,k=kernels(filt_size)
        for num in range(len(orign_data)-(filt_size-1)):
            #print((orign_data[num:num+5].reshape(-1,1)))
            if filt_size==1:
                break
            new_data[num+(int((filt_size-1)/2))]=(np.inner(orign_data[num:num+filt_size].reshape(1,-1),kernel))/k    #高斯滤波
            #new_data[num+(int((filt_size-1)/2))]=np.sum(orign_data[num]+orign_data[num+1]*2+orign_data[num+2]*3+orign_data[num+3]*2+orign_data[num+4])/9
        ax.plot(np.array(range(len(mean_sums))),new_data,label=str(process))   #numpy格式处理的快
        #plt.plot(11np.array(range(len(mean_sums))),orign_data,label=str(process),color="green")
        interval=int((len(mean_sums))//10)
        #for m in range(10):
            #plt.vlines(interval*m,np.array(mean_sums,dtype=float).min(),np.array(mean_sums,dtype=float).max(),color="red")
            #ax.text(interval*m,new_data.min(),str(time_display[interval*m]))
        ax.text(0,new_data.max(),'numbers='+str(len(mean_sums)))
        ax_top = ax.twiny()              #设置上下坐标轴一致
        xlim = ax.get_xlim()
        ax_top.set_xlim(xlim)  
        xticks = ax.get_xticks()
        #ax.set_xticks(xticks)
        ax.axhline(float(max_num), color="red")         #画上限线
        top_tick = []
        top_label = []
        for time_times in range(len(xticks)-2):        
            if xticks[time_times+1]>len(new_data):
                break
            #ax.axvline(xticks[time_times+1],linestyle='--',color="blue")
            top_tick.append(xticks[time_times+1])
            #print(time_times+1,xticks[time_times+1])
            top_label.append(time_display[int(xticks[time_times+1])]) # 这两行分别是要显示坐标的位置以及置换的标签
        if len(new_data)-top_tick[-1]>(top_tick[-1]-top_tick[-2])*0.5:
            #print(len(new_data),top_tick[-1],top_tick[-2])
            top_tick.append(len(new_data))
            top_label.append(time_display[-1])
            #ax.axvline(len(new_data),linestyle='--',color="blue")
        ax_top.set_xticks(top_tick)
        ax_top.set_xticklabels(top_label)
        ax.grid(ls='--')
        #plt.ylim(np.array(mean_sums,dtype=float).min(),float(max_num)+1)
        ax.legend()
    #plt.savefig('./'+name.split('.')[0]+'.png')
    print('have saved ...'+name.split('.')[0]+'.png')
    return new_data
    
all_name=os.listdir('./')
log_name=[]
filt_size = int(input('输入高斯滤波内核(原始图像输入1)(输入奇数)'))   
for name in all_name:
    if  name[-3:]=='log':
        log_name.append(name)
print('找到这几个文件:')
print(log_name)
if not len(log_name)==1:
    name_num = int(input('转化第几个?'))     
    file=log_name[name_num-1]
else :
    file=log_name[0]
print(file)
new=datacreate(file)
![在这里插入图片描述](https://img-blog.csdnimg.cn/201909302012442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyODI0MzM1,size_16,color_FFFFFF,t_70)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值