问题描述
我正在尝试解决上述 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=20
frame_size = Fs*4 #80
hop_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,N_FEATURES)
labels = np.asarray(labels)
return frames,labels
x,y = get_frames(scaled_x,hop_size)
x.shape,y.shape
((78728,80,3),(78728,))
解决方法
根据您发布的链接,数据是以 20 Hz 采样的时间序列加速度计/陀螺仪数据,每个样本都有一个标签。他们希望将时间序列聚合成帧(对应的标签是给定帧中最常见的标签)。
所以frame_size
是一帧中的样本数,hop_size
是滑动窗口每次迭代向前移动的量。换言之,自 hop_size = frame_size / 2
.
因此,最后您会得到一个长度为 80 的 78728 帧的 3D 数组,每个有 3 个值(x
、y
、z
)。
编辑:要回答有关如何导出为 CSV 的新问题,您需要将 3D 帧数组“展平”为 2D 数组,因为这是 CSV 所代表的内容。有多种不同的方法可以做到这一点,但我认为最简单的方法可能只是连接最后两个维度,这样每一行都是一个框架,由 240 个值(80 个样本,每个样本 3 个坐标)组成。然后连接标签作为最后一列。
x_2d = np.reshape(x,(x.shape[0],-1))
full = np.concatenate([x,y],axis=1)
import pandas as pd
df = 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)