摘要:本文主要内容为针对tsv格式的UCR数据集和arff格式的UEA数据集进行处理,将其中的标签和数据分离出来,并转换为csv文件和xlsx文件。文中也提供了UCR和UEA数据集的下载链接,供大家使用。
目录
前言
UEA数据集和UCR数据集,目前是时间序列挖掘领域重要的开源数据集资源,每个数据集样本都带有样本类别标签,为了方便处理,这里将其中的标签和数据分离出来,并转换为csv文件或xlsx文件。
数据集
注:下载数据集后,解压缩密码为 someone
点击链接,下载如图所示的arff格式的UEA数据集:
下载后的数据集如图所示:
UCR数据集:
UEA数据集
备注:UEA数据集的网站好像关闭了,虽然也有ts格式的数据集,官网链接如下:ts格式的UEA数据集
这里也提供下载网盘链接:Multivariate2018_ts.zip 提取码:CJL3
但是为了方便,这里也提供了arff格式的数据集 ,链接如下:arff格式的UEA数据集 提取密码:CJL2
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)
效果如图:
UEA数据集处理
说明:
- 以下提供了三种UEA数据存储方式,分别是npz、npy、xlsx格式,其中目前相关论文中常用npy或npz格式,xlsx用于序列可视化。
- 由于UEA数据标签有些是文本格式,所以不使用csv格式存储数据,而是使用xlsx格式。
- 读取arff格式的文件使用的是scipy.io中的arff.loadarff方法,但是官方给的arff文件中有注释(“%”开头的语句),所以处理之前需要将其删除。处理后的数据为:处理后的UEA数据1或处理后的UEA数据2
提取码:CJL4
代码如下:
# -*- coding: utf-8 -*-
# @File : UEA数据处理.py
import pandas as pd
import os
from scipy.io import arff
import numpy as np
import pandas as pd
from tqdm import tqdm
def load_data(data_path):
data, meta = arff.loadarff(data_path)
res_data = []
res_labels = []
for t_data, t_label in data:
t_data = np.array([d.tolist() for d in t_data])
t_label = t_label.decode("utf-8")
res_data.append(t_data)
res_labels.append(t_label)
return np.array(res_data).swapaxes(1, 2), np.array(res_labels)
def save_csv_data(data,file_name,tag='train'):
channel_num = data.shape[0]
for channel_idx in tqdm(range(channel_num)): # 读取每一个通道的数据
channel_data = data[channel_idx]
# 将 NumPy 数组转换为 pandas DataFrame
df = pd.DataFrame(channel_data)
data_file = f'{file_name}\\{tag}_dim{channel_idx+1}.xlsx'
df.to_excel(data_file, index=False)
# df.to_excel(data_file, index=False,header=None)#第一行不添加时间戳
def save_data(train_data, train_label,test_data, test_label, file_name,data_name,tag='npz'):
if tag == 'npz':
# np.savez(file_name,train_X=train_data,train_Y=train_label,test_X=test_data,test_Y=test_label)
np.savez_compressed(file_name, train_X=train_data, train_Y=train_label, test_X=test_data, test_Y=test_label)#使用压缩方法
elif tag == 'npy':
data_dict = {}
data_dict["train_X"]= train_data
data_dict["train_Y"] = train_label
data_dict["test_X"] = test_data
data_dict["test_Y"]= test_label
np.save(file_name,data_dict)
elif tag == 'xlsx':
#将通道置于第一个维度 维度变为N L C -> C N L
train_data = np.transpose(train_data,(2,0,1))
test_data = np.transpose(test_data, (2, 0, 1))
# 将每个通道数据写入1个xlsx文件中
save_csv_data(train_data,file_name,tag='train')
save_csv_data(test_data, file_name,tag='test')
#写入标签,由于标签可能不是数字,所以不写入csv文件而是excel文件
df_train_label = pd.DataFrame(train_label)
df_train_label.to_excel(f'{file_name}\\train_label.xlsx', index=False,header=None)
df_test_label = pd.DataFrame(test_label)
df_test_label.to_excel(f'{file_name}\\test_label.xlsx', index=False,header=None)
else:
print('No implemented...')
arff_path = 'D:\\资料\\数据集\\数据集\\Multivariate2018_arff\\New_Multivariate_arff'
tag = 'npz' # 保存的数据的格式
target_path = f'D:\\资料\\数据集\\数据集\\Multivariate2018_{tag}'
def process_uea_data(arff_path,target_path,tag):
# 如果数据目录不存在,则创建
if not os.path.exists(target_path):
os.mkdir(target_path)
wrong_data = ['EigenWorms']#由于数据集太大,处理成xlsx内存不够
for data_name in os.listdir(arff_path):
train_file = f'{arff_path}\\{data_name}\\{data_name}_TRAIN.arff'
test_file = f'{arff_path}\\{data_name}\\{data_name}_TEST.arff'
train_data,train_label = load_data(train_file)
test_data, test_label = load_data(test_file)
data_dir = f'{target_path}\\{data_name}'
if not os.path.exists(data_dir):
os.mkdir(data_dir)
if tag == 'npz':
file_name = f'{data_dir}\\{data_name}.npz'
save_data(train_data, train_label,test_data, test_label, file_name,data_name, tag=tag)
elif tag == 'npy':
file_name = f'{data_dir}\\{data_name}.npy'
save_data(train_data, train_label, test_data, test_label, file_name,data_name, tag=tag)
elif tag == 'xlsx':
# EigenWorms数据序列长度太大了,处理不了
if data_name in wrong_data:
continue
file_name = f'{data_dir}'
save_data(train_data, train_label, test_data, test_label, file_name,data_name, tag=tag)
else:
print('No implemented...')
print_info = f'{data_name} finished!'
print(f'{print_info}{(70-len(print_info))*"="}')
process_uea_data(arff_path,target_path,tag)
'''---------------------------读取数据-------------------------------
#加载npy数据
data = np.load('XXX.npy',allow_pickle=True).item()
train_X,train_Y,test_X,test_Y = data['train_X'],data['train_Y'],data['test_X'],data['test_Y']
#加载npz数据
data = np.load('XXX.npz',allow_pickle=True)
train_X,train_Y,test_X,test_Y = data['train_X'],data['train_Y'],data['test_X'],data['test_Y']
'''
效果如图:
- npy格式的数据
- npz格式的数据:
- xlsx格式的数据:
总结
arff格式的UEA数据集的处理当然可以使用Weka软件进行处理,具体参考:
但是一个一个转换起来太麻烦了,还不如自己写个python程序。