最近在做脑疾病的静息态功能磁共振成像(Rs-fMRI)数据的分类,Rs-fMRI数据也包括成像数据和非成像数据,这里只讨论关于成像数据的一些问题。
成像数据又包括功能磁共振图像数据以及从功能磁共振图像数据中按照一定的预处理步骤提取出来的BOLD信号时间序列数据。
这里的BOLD信号时间序列数据也就是多变量时间序列数据的一种,但是经过预处理得到的时间序列数据都是以.mat文件形式进行存储的,而现在对于大多数多变量时间序列数据进行处理的sktime包都是输入.ts后缀的文件并读取为dataframe形式。
BOLD信号时间序列的.mat后缀文件使用
scipy.io.loadmat()
读取,得到的是三维np.array数据(形状为(batch_size, num_ROIs, num_timesteps)),而使用
sktime.load_from_tsfile_to_dataframe()
读取.ts后缀文件得到的是pd.dataframe数据(二维的dataframe,形状为(batch_size, num_ROIs),第二个维度里的每一个单元格里都是一个num_timesteps长度的时间序列数据)。
由于现有的时间序列分类模型都是接受.ts文件作为输入并读取为dataframe数据,而自己现有的数据又只能读取为三维的array数据,无法直接输入到现有的多变量时间序列模型中,因此想找到一种方法可以进行这种转换,但是暂未找到,所以作为一个记录贴放在这儿吧,等找到解决方法了就更新。
=========================================================================
更新于2022/10/6
自己编写了一个函数实现从三维数组到二维dataframe的变换函数:
def from_array_to_dataframe(X):
# 一共三个维度,将每个人每个脑区的时间序列存入一个单元格中
b_s = X.shape[0]
n_rois = X.shape[1]
n_ts = X.shape[2]
# 创建空dataframe
df = pd.DataFrame(dtype=np.float32)
# 循环将时间序列数据写入dataframe中
for v1 in range(n_rois):
df['dim_' + str(v1)]=[ X[v0][v1] for v0 in range(b_s)]
return df
并且进行调试:
if __name__ == '__main__':
X = np.zeros((32, 116, 140))
df = from_array_to_dataframe(X)
print(df.values.shape)
print(len(df.values[0][0]))
输出:
(32, 116)
140
达到目的。