Python数据处理应用

前言

最近在做数据分析的过程中,又一次领会到python工具的强大,这次介绍的工具主要结合了之前的工具进行的扩展,方便对于大量数据的统计分析和处理。极大的提高了工作的开发效率。接下来详解接收其应用。

使用场景

将一串通过串口保存的log数据,根据通信协议进行数据解析,将解析结果保存在csv文件中,并根据解析出的数据画出图表。(log数据为16进制文本,类hex文件)

编写流程

1.遍历文本

按顺序将文件夹下所有的文本都按顺序打开,可以参考之前的一篇文章关于OS库的一个功能。

python工具学习(一) - 一月一星辰 - 博客园 (cnblogs.com)

2.创建读取,输出文件的路径

txt_path = "{}\\{}".format(log_path,each_file)
csv_path = "{}\\{}.csv".format(data_path,os.path.splitext(each_file)[0])
html_path = "{}\\{}.html".format(data_path,os.path.splitext(each_file)[0])

os.path.splitext(each_file)[0]获取读取文本的名称,根据输入名称输出对于文本名称的CSV和图表文件

3.核心内容

with open(txt_path,"r",encoding="utf-8") as file: #打开文本
    while True:
        data_part = file.read(3)   #读取文本前三个字符
        if(data_part == data_head[0]): #判断是否符合通信协议头字符
            data_part = file.read(3)
            if(data_part == data_head[1]):
                data_part = file.read(3)
                if(data_part == data_head[2]): #满足全部头协议判断,将后续数据存入data_buff
                    data_buff.append(file.read(30))
        if(data_part == ""):#当文件内容读取完成后
            for each_data in data_buff:#处理列表data_buff每个元素
                #print(each_data)
                each_data_list = each_data.split()#按 空格 将字符分离
                #print(each_data_list)
                red_data_hex = "{}{}{}".format(each_data_list[0],each_data_list[1],each_data_list[2])#红光数据
                ir_data_hex = "{}{}{}".format(each_data_list[3],each_data_list[4],each_data_list[5])#红外数据
                amb_data_hex = "{}{}{}".format(each_data_list[6],each_data_list[7],each_data_list[8])#环境光数据

                red_data_dec = int(red_data_hex,16)#将16进制转成10进制
                ir_data_dec = int(ir_data_hex,16)
                amb_data_dec = int(amb_data_hex,16)

                red_data_hex_list.append(red_data_hex)#批量添加进buff区
                ir_data_hex_list.append(ir_data_hex)
                amb_data_hex_list.append(amb_data_hex)
                red_data_dec_list.append(red_data_dec)
                ir_data_dec_list.append(ir_data_dec)
                amb_data_dec_list.append(amb_data_dec)
            break
    #画图
    x_axis = range(0,len(red_data_dec_list)) 

    line_obj = Line(init_opts=opts.InitOpts(width="1600px", height="700px"))
    line_obj.add_xaxis(xaxis_data=x_axis)#red ir 长度一样
    line_obj.add_yaxis(
            series_name="red_data",
            y_axis=red_data_dec_list,
            color='red'
            )
    line_obj.add_yaxis(
            series_name="ir_data",
            y_axis=ir_data_dec_list,
            color='green'
            )
    line_obj.set_global_opts(
                title_opts=opts.TitleOpts(title="PPG DATA", subtitle="PPG DATA"),
                tooltip_opts=opts.TooltipOpts(trigger="axis"),
                toolbox_opts=opts.ToolboxOpts(is_show=True),
                xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
                yaxis_opts=opts.AxisOpts(min_='dataMin')
            )
    line_obj.render(html_path)
    
    #输出为csv文件
    ppg_data = pd.DataFrame({
        "red_data_hex":red_data_hex_list,
        "ir_data_hex":ir_data_hex_list,
        "amb_data_hex":amb_data_hex_list,
        "red_data_dec":red_data_dec_list,
        "ir_data_dec":ir_data_dec_list,
        "amb_data_dec":amb_data_dec_list,
    })
    #print(csv_path)
    ppg_data.to_csv(csv_path, mode='w+', header=True, index = False,encoding='utf-8')

这里详细说明一下画图库的使用,csv使用可以见之前文章pandas库的说明

python工具学习(一) - 一月一星辰 - 博客园 (cnblogs.com)

可视化神器之pyecharts

1.安装pyecharts

pip install pyecharts

2.使用步骤

  1. 导入库

    import pyecharts.options as opts
    from pyecharts.charts import Line
    
  2. 确定横轴长度

    x_axis = range(0,len(red_data_dec_list)) 
    
  3. 初始化表格大小

    line_obj = Line(init_opts=opts.InitOpts(width="1600px", height="700px"))
    
  4. 添加x,y轴数据

    line_obj.add_xaxis(xaxis_data=x_axis)#red ir 长度一样
    line_obj.add_yaxis(
            series_name="red_data", #设置折线名称
            y_axis=red_data_dec_list,#添加入的数据
            color='red'   #设置折线颜色
            )
    line_obj.add_yaxis(
            series_name="ir_data",
            y_axis=ir_data_dec_list,
            color='green'
            )
    
  5. 设置全局配置

    line_obj.set_global_opts(
                title_opts=opts.TitleOpts(title="PPG DATA", subtitle="PPG DATA"), #图表名称
                tooltip_opts=opts.TooltipOpts(trigger="axis"), #坐标轴触发方式
                toolbox_opts=opts.ToolboxOpts(is_show=True,pos_left = "right",pos_top="top"),#工具栏显示
                xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), #坐标轴配置
                yaxis_opts=opts.AxisOpts(min_interval = 1)
            )
    

    更多详细配置可以参考

    简介 - pyecharts - A Python Echarts Plotting Library built with love.

  6. 生成html文件

    line_obj.render(html_path)
    

3.展示效果

img

后记

pyecharts其实还有很多其他的用法,这里只列举了我工作中经常使用的一种功能,详细用法可以自行去学习,用好工具,事半功倍!

2023/3/21更新

利用正则表达式进行批量查找文本

详细方法可以参考如何利用python批量提取txt文本中所需文本并写入excel

这里提供一个十分好用的工具生成正则表达式:chatGPT

例如:查找文本为由 “BA 0A 21” 开头后含有10个十六进制的数据

非常强大的生成正则表达式的方法。

        f1 = list(open(txt_path,"r",encoding="utf-8"))
        f2 = "".join(f1)
        pattern = re.compile(r'B6 0A 21(?: [0-9A-Fa-f]{2}){10}',flags=re.DOTALL)
        if len(pattern.findall(f2))==0:#有可能找不到,以防报错
            result='none'
        else:
            for i in range(len(pattern.findall(f2))):
                print(pattern.findall(f2)[i])

这样就可以非常快速查找到想要的数据。

posted @ 2023-02-22 20:53  一月一星辰  阅读(39)  评论(0编辑  收藏  举报