一、程序结构展示
上几篇笔记主要介绍了项目中datasets目录下的各个文件的内容及作用,从本篇笔记开始讲解项目中utils下的各个代码,因为_init_.py文件为空,所以本篇笔记从csv_utils.py文件入手开始讲解。
二、代码功能介绍
这段代码是一个用于写入实验结果到CSV文件的Python函数。其中有三个名词需要着重介绍的:
1. 字典
字典(Dictionary)是 Python 中的一种数据结构,用于存储键值对(key-value pairs)。它是一个无序的集合,其中每个元素由一个键(key)和一个对应的值(value)组成。键必须是唯一的且不可变的,通常是字符串或数字,而值可以是任意类型的数据,包括列表、元组、其他字典等。通过键可以快速地查找对应的值,从而实现高效的数据检索和操作。
2. 键值
键值(Key-Value)指的是字典中的每个元素,其中一个键与其对应的值构成一对。通过键来访问值,这种键值对的结构是字典的基本特征。
3. DataFrame
DataFrame是 pandas 库中的一种数据结构,类似于电子表格或关系型数据库中的表格。它是一个二维标记数组,每列可以包含不同类型的数据(整数、浮点数、字符串等),并且可以通过标签或整数索引访问行和列。DataFrame 提供了丰富的方法和函数用于数据操作、筛选、聚合和分析,是进行数据处理和分析的常用工具。
4. CSV文件
CSV(Comma-Separated Values)文件是一种常见的文本文件格式,用于存储表格数据。每行代表表格中的一条记录,每列之间用逗号或其他特定的分隔符(如制表符、分号等)进行分隔。CSV 文件通常不包含行和列的标题,但也可以包含。由于其简单的结构和普遍的可读性,CSV 文件在数据交换和存储中被广泛应用,尤其是在数据分析和机器学习领域。
三、代码逐行注释
import pandas as pd # pandas是一个提供了丰富苏基本结构和数据分析工具包的python库。
import os # os是python的内置库,提供了访问操作系统功能的接口。
def write_results(results:dict, cur_class, total_classes, csv_path): # 函数“write_results”接受四个参数:包含结果的字典、当前类别、所有类别的列表、csv文件路径
keys = list(results.keys()) # 提取结果字典中的所有键,保存在列表keys中
if not os.path.exists(csv_path): # 如果指定的csv文件路径不存在
df_all = None # 就创建一个新的dataFrame(类似于表格)命名为df_all,以此来存储所有类别的结果
for class_name in total_classes: # 遍历“total_classes”列表
r = dict() # 对每个类别初始化一个字典r
for k in keys: # 键是结果的键,初始化键值为0.00
r[k] = 0.00
df_temp = pd.DataFrame(r, index=[class_name]) # 使用这个字典创建DataFrame“df_temp”
if df_all is None:
df_all = df_temp
else:
df_all = pd.concat([df_all, df_temp], axis=0) # 通过“pd_concat”的方法将“df_temp”连接到“df_all”中
df_all.to_csv(csv_path, header=True, float_format='%.2f') # 将df_all文件保存为csv文件
df = pd.read_csv(csv_path, index_col=0) # 读取CSV文件中的内容到DataFrame“df”中
for k in keys:
df.loc[cur_class, k] = results[k]
df.to_csv(csv_path, header=True, float_format='%.2f')
def save_metric(metrics, total_classes, class_name, dataset, csv_path):# 这个函数接受五个参数:包含度量结果的字典、所有类别的列表、当前类别的名称、数据集名称、CSV文件路径
if dataset != 'mvtec': # 如果dataset不是mvtec这个数据集的话
for indx in range(len(total_classes)): # 对total_classes列表里面的每个类别名称添加datasets的前缀
total_classes[indx] = f"{dataset}-{total_classes[indx]}"
class_name = f"{dataset}-{class_name}" # 并且为class_name 添加dataset的前缀
write_results(metrics, class_name, total_classes, csv_path) # 调用这个函数将度量结果写入csv文件中