UEA数据集和UCR数据集的处理

摘要:本文主要内容为针对tsv格式的UCR数据集和arff格式的UEA数据集进行处理,将其中的标签和数据分离出来,并转换为csv文件

目录

前言

数据集

UCR数据集处理

UEA数据集处理

对FaceDetection和InsectWingbeat数据集的处理

总结

处理后的数据集:


前言

UEA数据集和UCR数据集,目前是时间序列挖掘领域重要的开源数据集资源,每个数据集样本都带有样本类别标签,为了方便处理,这里将其中的标签和数据分离出来,并转换为csv文件

数据集

UCR数据集

注:下载数据集后,解压缩密码为 someone

UEA数据集

点击链接,下载如图所示的arff格式的UEA数据集:

ab0db52a409c4121949cf6f0541e9208.png

下载后的数据集如图所示:

UCR数据集:

de98707cc9024e61ab3f142c215c9a5b.png

UEA数据集

c1c4243fac334e49b7053b4cba11483b.png


UCR数据集处理

代码如下:

import os
import pandas as pd
datapath="E:/桌面/代码/数据集/UCRArchive_2018/UCRArchive_2018"
save_data_path="E:/桌面/代码/数据集/UCRArchive_2018_csv"
def cope_UCR(datapath,save_data_path):
    '''
    :param datapath: tsv格式的UCR数据集路径,type:string
    该数据集结构为:
    -E:/桌面/代码/数据集/UCRArchive_2018/UCRArchive_2018
        -ACSF1
            -ACSF1_TEST.tsv
            -ACSF1_TRAIN.tsv
            -README.md
        -Adiac
            -Adiac_TEST.tsv
            -Adiac_TRAIN.tsv
            -README.md
        -AllGestureWiimoteX
            -AllGestureWiimoteX_TEST.tsv
            -AllGestureWiimoteX_TRAIN.tsv
            -README.me
        -......
    :param save_data_path: 保存转换为csv格式的UCR数据集的路径 type:string
        该数据集结构为:
    -E:/桌面/代码/数据集/UCRArchive_2018_csv
        -ACSF1
            -TEST.csv
            -TEST_label.csv
            -TRAIN.csv
            -TRAIN_label.csv
        -Adiac
            -TEST.csv
            -TEST_label.csv
            -TRAIN.csv
            -TRAIN_label.csv
        -AllGestureWiimoteX
            -TEST.csv
            -TEST_label.csv
            -TRAIN.csv
            -TRAIN_label.csv
        -......
    每个数据集下包含测试集数据、测试集标签、训练集数据、训练集标签

    :return:None
    '''
    data_list=os.listdir(datapath)
    for data_name in data_list:
        #读取每个数据集下的train test readme文件
        new_data_path=datapath+"/"+data_name
        train_test_readme=os.listdir(new_data_path)
        for data_file in train_test_readme:
            if data_file.endswith('.tsv'):#如果文件以tsv结尾
                data_label = pd.read_csv(new_data_path+"/"+data_file, sep='\t',header=None)

                label = data_label.iloc[:, 0]
                data = data_label.iloc[:, 1:]

                data_csv_dir=save_data_path+"/"+data_name
                #如果数据目录不存在,则创建
                if not os.path.exists(data_csv_dir):
                    os.mkdir(data_csv_dir)

                # 将标签和数据分别存到csv文件中
                file_name=data_file.split('_')[1].split('.')[0]
                prefix_path=data_csv_dir+"/"+file_name
                #用savetxt精度会出问题
                # label=data_label.iloc[:,0].values
                # data=data_label.iloc[:,1:].values
                # np.savetxt(prefix_path+"_label.csv", label, delimiter=",",encoding='utf-8',fmt='%f')
                # np.savetxt(prefix_path+".csv", data, delimiter=",",encoding='utf-8',fmt='%f')

                label.to_csv(prefix_path+"_label.csv",mode='w',index=False,header=None,encoding='utf-8')
                data.to_csv(prefix_path+".csv",mode='w',index=False,header=None,encoding='utf-8')
        print(data_name)
cope_UCR(datapath,save_data_path)

效果如图:

227b79b21d0e40ef9d7e235b388c3a91.png

UEA数据集处理

代码如下:

import pandas as pd
import os
import natsort
data_set_dir='E:/桌面/代码/数据集/Multivariate2018_arff/Multivariate_arff'
data_save_dir='E:/桌面/代码/数据集/Multivariate2018_arff_csv'

def arff_to_csv(data_set_dir,data_save_dir):
    '''
    
    :param data_set_dir: 下载的数据集路径
    :param data_save_dir: 保存csv数据集的保存路径
    :return: None
    '''
    # 读取数据包下的所有数据名
    data_set_list=os.listdir(data_set_dir)
    for dataset_name in data_set_list:
        # dataset_name为[ArticularyWordRecognition,AtrialFibrillation,BasicMotions,CharacterTrajectories,...]
        dataset_name_path=data_set_dir+"/"+dataset_name
        if os.path.isdir(dataset_name_path):#如果为路径,遍历该路径下的所有文件
            # dataset_name_path_list=os.listdir(dataset_name_path)

            #路径列表按照系统排序方式进行排序
            dataset_name_path_list = natsort.natsorted(os.listdir(dataset_name_path), alg=natsort.ns.PATH)
            # 数据集标签是否已写入的标志
            train_label_tag = False
            test_label_tag = False
            for data_file in dataset_name_path_list:
                #数据格式
                data_format=data_file.split('.')[1]
                #文件名
                data_name=data_file.split('.')[0]

                #只转换arff文件和包含Dimension文件
                if data_format=='arff' and 'Dimension' in data_name:

                    # 训练集还是测试集
                    train_or_test = data_name.split('_')[1].lower()
                    file_name=dataset_name_path+"/"+data_file
                    with open(file_name,encoding="utf-8") as f:
                        header = []
                        for line in f:
                            if line.startswith("@attribute"):
                                header.append(line.split()[1])
                            elif line.startswith("@data"):
                                break
                        if os.path.getsize(file_name) > 0:
                            data_label = pd.read_csv(f, header=None)
                        else:
                            print("---发现一个空数据文件---"+data_file)
                            continue
                        #标签
                        label = data_label.iloc[:, -1]
                        #数据
                        data = data_label.iloc[:, :data_label.shape[1]-1]

                        data_csv_dir = data_save_dir + "/" + dataset_name
                        # 如果数据目录不存在,则创建
                        if not os.path.exists(data_csv_dir):
                            os.mkdir(data_csv_dir)

                        file_name_data=data_save_dir+"/"+dataset_name+"/"+data_name
                        file_name_label = data_save_dir + "/" + dataset_name + "/" + train_or_test + "_label.csv"

                        if not train_label_tag and train_or_test == 'train':#如果数据集的标签未写入且为训练集,则写入训练集的标签
                            label.to_csv(file_name_label , mode='w', index=False, header=None, encoding='utf-8')
                            train_label_tag=True
                        if not test_label_tag and train_or_test == 'test':#如果数据集的标签未写入且为测试集,则写入测试集的标签
                            label.to_csv(file_name_label , mode='w', index=False, header=None, encoding='utf-8')
                            test_label_tag = True

                        data.to_csv(file_name_data + ".csv", mode='w', index=False, header=None, encoding='utf-8')
                        print(data_file)
        print(dataset_name)

arff_to_csv(data_set_dir,data_save_dir)

效果如图:

e0eb9b835a334cc1b422f7f3839ad910.png

对FaceDetection和InsectWingbeat数据集的处理

由于FaceDetection和InsectWingbeat数据集在官方给的文件中没有对数据进行维度的划分,如下图所示:

c70a3bbca69c4a71a2f7021bac2d4903.png62afea5ef50d4c8c917ec4491de32b5a.png

为此,需要对这些数据集进行额外的处理。首先需要通过查看文件内容和数据集的描述文件,确定数据的维度和序列长度,如图所示:

9ea935167c54487abdd89f5d5e00fd43.png

cd7b800db70d4302a71bbf3501a6b8bc.png

python代码如下:

import csv
import os
FaceDetection_Path = f'D:\\资料\\数据集\\数据集\\Multivariate2018_arff\\Multivariate_arff\\FaceDetection'
InsectWingbeat_Path = f'D:\\资料\\数据集\\数据集\\Multivariate2018_arff\\Multivariate_arff\\InsectWingbeat'

Dimensions_dict = dict(
    FaceDetection=144,
    InsectWingbeat=200,
)
def Process_Data(data_path,target_path='./'):
    '''
    步骤:
        -1.读取.arff文件
        -2.找到@data文件,以\n为分割,得到不同dimension的数据
        -3.按不同的dimension写入数据
    :return:None
    '''
    data_set_name = data_path.split('\\')[-1]#数据集名字
    Dimensions = Dimensions_dict[data_set_name]
    # 处理后的文件默认存放在当前项目下
    result_path = os.path.join(target_path,data_set_name)
    # 如果数据目录不存在,则创建
    if not os.path.exists(result_path):
        os.mkdir(result_path)
    File_list = os.listdir(data_path)
    for file in File_list:
        if file.endswith('arff'):# 如果是arff类型的文件
            # 判断是训练集还是测试集
            file_path = os.path.join(data_path,file)
            if 'train' in file.lower():
                train_or_test =  'train'
            elif 'test' in file.lower():
                train_or_test = 'test'
            else:
                raise Exception('在判断文件为训练集或测试集时报错!!!')
            with open(file_path, encoding="utf-8") as f:
                header = []
                for line in f:
                    if line.startswith("@attribute"):
                        header.append(line.split()[1])#存放数据集的 序列长度 或 维度 大小
                    elif line.startswith("@data"):
                        break
                if os.path.getsize(file_path) > 0:
                    data_f = f
                else:
                    print("---发现一个空数据文件---" + file_path)
                    continue
                #读取数据中的每一行
                # 创建一个字典,用于存放不同维度的数据
                data_dict = {}
                for i in range(1,Dimensions+1):
                    data_dict[i] = []
                #用于存放标签
                label_list =[]
                for data_line in data_f:#每一个data_line就是一个实例,即一条数据
                    #去除单引号
                    data_line = data_line.replace("'","").strip()
                    #以\n为分割
                    data_label = data_line.split('\\n')#data_label的长度为144,即维度
                    if len(data_label) != Dimensions:
                        raise Exception('数据集的维度不一致!!!')
                    label = data_label[-1].split(',')[-1]#获取标签
                    data_label[-1] = ','.join(data_label[-1].split(',')[:-1])#去掉标签和逗号
                    label_list.append([label])
                    # 将数据按不同的维度索引放到data_dict中
                    for j in range(len(data_label)):
                        data = [i for i in data_label[j].split(',')]
                        data_dict[j+1].append(data)
                # 创建dimension文件,将数据存放到不同的Dimension文件下
                for dimension_index in data_dict.keys():
                    data=data_dict[dimension_index]
                    #创建文件名
                    file_name = data_set_name+'Dimension'+str(dimension_index)+'_'+train_or_test.upper()+'.csv'
                    file_name_path = os.path.join(result_path,file_name)
                    with open(file_name_path, 'w', newline='') as file:
                        writer = csv.writer(file)
                        # 写入数据
                        writer.writerows(data)
                        print(f'已处理完dimension_index:{dimension_index}!!!')
                # 将标签写入到csv中
                label_name = train_or_test.lower()+'_label.csv'
                label_name_path = os.path.join(result_path,label_name)
                with open(label_name_path, 'w', newline='') as file:
                    writer = csv.writer(file)
                    # 写入数据
                    writer.writerows(label_list)
Process_Data(InsectWingbeat_Path)

总结

arff格式的UEA数据集的处理当然可以使用Weka软件进行处理,具体参考:

Weka使用

但是一个一个转换起来太麻烦了,还不如自己写个python程序。

处理后的数据集:

CSV格式的UCR数据集

CSV格式的UEA数据集

CSV格式的FaceDetection和InsectWingbeat数据集

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值