我在尝试解决上述Kaggle问题,并希望导出预处理后的CSV文件,以便在Weka上构建模型,但当我尝试将其保存为CSV时,我丢失了一个维度,我希望在CSV中保留所有信息。
请提供相关代码或任何资源帮助我。
谢谢
print (scaled_x) |x |y |z |label |1.485231 |-0.661030 |-1.194153 |0 |0.888257 |-1.370361 |-0.829636 |0 |0.691523 |-0.594794 |-0.936247 |0
Fs=20frame_size = Fs*4 #80hop_size = Fs*2 #40 def get_frames(df, frame_size, hop_size): N_FEATURES = 3 frames = [] labels = [] for i in range(0,len(df )- frame_size, hop_size): x = df['x'].values[i: i+frame_size] y = df['y'].values[i: i+frame_size] z = df['z'].values[i: i+frame_size] label = stats.mode(df['label'][i: i+frame_size])[0][0] frames.append([x,y,z]) labels.append(label) frames = np.asarray(frames).reshape(-1, frame_size, N_FEATURES) labels = np.asarray(labels) return frames, labels
x,y = get_frames(scaled_x, frame_size, hop_size) x.shape, y.shape((78728, 80, 3), (78728,))
回答:
根据您发布的链接,数据是每秒20次采样的时间序列加速度计/陀螺仪数据,每个样本都有一个标签。他们希望将时间序列聚合成帧(相应的标签是给定帧期间最常见的标签)。
因此,frame_size
是帧中的样本数,hop_size
是每次迭代滑动窗口向前移动的量。换句话说,帧重叠50%,因为hop_size = frame_size / 2
。
因此,最终您会得到一个包含78728个长度为80的帧的3D数组,每个帧有3个值(x
,y
,z
)。
编辑:为了回答您关于如何导出为CSV的新问题,您需要将3D帧数组“展平”为2D数组,因为CSV表示的是2D数组。有多种不同的方法可以做到这一点,但我认为最简单的可能是连接最后两个维度,这样每行就是一个帧,由240个值组成(80个样本,每个样本有3个坐标)。然后将标签作为最后一列连接起来。
x_2d = np.reshape(x, (x.shape[0], -1))full = np.concatenate([x, y], axis=1)import pandas as pddf = pd.DataFrame(full)df.to_csv("frames.csv")
如果您还想要正确的列名:
columns = []for i in range(1, x.shape[1] + 1): columns.extend([f"{i}_X", f"{i}_Y", f"{i}_Z"])columns.append("label")df = pd.DataFrame(full, columns=columns)