利用Python进行数据分析--批量处理CAN报警数据,统计误报率

        利用Python批量处理路试采集的CAN原始数据,并计算报警总数及误报漏报次数,实现方法如下:

# *-* coding:utf8 *-*
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import os

# 函数作用:将16进制字符串转换为16进制整型
def DecToHex(num):
    result = str(hex(eval(num)))
    return result
# 函数作用:在数据路径下(us_file_path)自动生成两个txt文件,存储左右报警数据
def CreatTxtFile(us_file_path):
    pass

# 函数作用:遍历并获取某一文件夹下的数据名称
def GetFileFoderName(us_file_path):
    fliename = os.listdir(us_file_path)  #打开这个文件夹
    return fliename

# 函数作用:将ASC数据中的时间戳和报警信号原始值做筛选后,写入新的txt文件中
def SellectSignal_to_TxtFile(us_file_path, ID1, ID2):
    # 导入asc数据
    data = open(us_file_path, "r")
    readlines = data.readlines()
    for line in readlines:
        if line.__contains__(ID1):
            message = np.array(line)
            with open("./Data/BSD_WarningL.txt", "a") as BSD_WarningL:
                BSD_WarningL.write(str(message))
        if line.__contains__(ID2):
            message = np.array(line)
            with open("./Data/BSD_WarningR.txt", "a") as BSD_WarningR:
                BSD_WarningR.write(str(message))
    data.close()

def ReadSignal(us_file_path):
    # 导入txt文件
    rawData = pd.read_csv(us_file_path, header=None)
    # 拆分字符串
    data = rawData[0].str.split(' ', expand=True)
    # 提取指定列--时间,BSD报警帧
    data = pd.DataFrame(data, columns=[3, 24])
    data = data[24]

    return data

us_file_path = "./Data"

# 创建文本文件BSD_WarningL.txt,BSD_WarningR.txt
# CreatTxtFile(us_file_path)

filename = GetFileFoderName(us_file_path)
num = len(filename)

# 逐行读取,筛选报警报文对应字节
for i in range(2, num):
    # 将路径和数据名称拼接:os.path.join()
    path = os.path.join(us_file_path, filename[i])
    SellectSignal_to_TxtFile(path, 'ID = 32', 'ID = 21')
    print(path)

data_L = ReadSignal(os.path.join(us_file_path, 'BSD_WarningL.txt'))
data_R = ReadSignal(os.path.join(us_file_path, 'BSD_WarningR.txt'))

last_bsd_L = 0
bsd_warning_L = 0
count_L = 0
last_bsd_R = 0
bsd_warning_R = 0
count_R = 0

error = int(input("输入路试过程中功能误报次数:"))

# 统计左侧报警次数
for j in range(len(data_L)):
    data_L[j] = '0x' + data_L[j]  # 将16进制字符串拼接“0x”,便于数据格式转化
    # data_temp_L = DecToHex(data_L[j])
    data_temp_L = int(data_L[j], 16)

    if ((data_temp_L & 0x08) == 0x08):  # 计算报警信号置位时对应byte,与data[j]做与操作,判断报警
        if (last_bsd_L == 0):
            count_L = count_L + 1
            last_bsd_L = 1
        else:
            pass
    else:
        last_bsd_L = 0
print("左侧报警总数为: %d 次" % count_L)

# 统计右侧报警次数
for k in range(len(data_R)):
    data_R[k] = '0x' + data_R[k]
    data_temp_R = DecToHex(data_R[k])
    data_temp_R = int(data_R[k], 16)

    if((data_temp_R & 0x10) == 0x10):

        if(last_bsd_R == 0):
            count_R = count_R + 1
            last_bsd_R = 1
        else:
            pass
    else:
        last_bsd_R = 0

print("右侧报警总数为: %d 次" % count_R)
num_total = count_L+count_R
error_frequent = (error/num_total)*100
print("报警总数为 %d 次,误报率为: %.2f%%" % (num_total, error_frequent))

输出结果如下:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值