## 关于ExtraSensory 数据集的分析过程
> 在这一周的学习当中,我进行对UCSD的传感器数据集进行了分析和学习,我对我学习和尝试的过程,进行复盘
我们首先先从需要解决的问题入手:
- 我们需要对数据进行了解和清洗
- 清洗完成后我们需要对其做一个分类的问题
## 观察数据
根据官网的描述,我们得知如下:
ExtraSensory 数据集由 UCSD 下 Yonatan Vaizman 和 Katherine Ellis 收集, 由手机 APP --the
ExtraSensory App进行收集,收集的信息为手机各类传感器的数据和此时的人体状态等一些数据。
该数据集有 60个'csv.gz'文件,文件的命名格式为[UUID].features_label.csv.gz。 UUID为每个用户独有的 ID, 使用 gzip 进行压缩。
我们打开其中一个UUID为 1155FF54-63D3-4AB2-9863-8385D0BD0A13 的单个数据集
进行分析

我们对其进行具体的观察,我们得知在该数据集中以timestamp作为主键进行排序,拥有221个feature,和51个label,和一个sourelabel(此不作为label进行学习)
我当时第一个想法是将csv文件读入后,将timestamp、feature、label三部分进行划分,单独取出来
```
# parse_header_of_csv函数将feature和label进行区分归类
# parse_body_of_csv函数将feature和label的具体数据进行分割存储
# read_user_data函数将csv文件读入
def parse_header_of_csv(csv_str):
headline = csv_str[:csv_str.index('\n')]
column = headline.split(",")
# 进行assert测试
assert column[0] == 'timestamp'
assert column[-1] == 'label_source'
# 找到label开始的位置
for (ci,col) in enumerate(column):
if col.startswith("label:"):
first_start_lind = ci
break
pass
feature_names = column[1:first_start_lind]
label_names = column[first_start_lind:-1]
##去除多余无效的字符
for (li,label) in enumerate(label_names):
# assert
assert label.startswith("label:")
label_names[li] = label.replace('label:',"")
pass
return (feature_names, label_names)
def parse_body_of_csv(csv_str,n_feature):
full_body = np.loadtxt(StringIO(csv_str),delimiter=',',skiprows=1)
# 数据的主键为timestamp
timestamps = full_body[:,0].astype(int)
# 将特征和标签分开,前面的是特征即传感器
X = full_body[:,1:(n_feature+1)]
#分离出所有label数据
trinary_labels_mat = full_body[:,(n_feature+1):-1]
M = np.isnan(trinary_labels_mat)# 将其进行判断有哪些是nan值
Y = np.where(M,0,trinary_labels_mat)>0.## 进行判断哪里有Nan值则将其转化为0,则保留原来的数值
##并将其转化为布尔值
return (X,Y,M,timestamps)
# 输出feature数据矩阵X,label数据矩阵Y,label的缺失数据分布矩阵M,feature_names,label_names
def read_user_data(uiud):
user_data_file = '%s.features_labels.csv.gz'%uuid
with gzip.open(user_data_file,'r') as fid:
csv_str = fid.read()
csv_str = csv_str.decode(encoding = 'utf-8')
pass
(feature_names,label_names) = parse_header_of_csv(csv_str)
n_feature = len(feature_names)
(X,Y,M,timestamps) = parse_body_of_csv(csv_str, n_feature)
return (X,Y,M,timestamps,feature_names,label_names)
```
在这段代码中,主要有三个函数
def read_user_data(uiud)读入用户数据,并且其中将读取数据的过程再次抽离出两个函数进行抽象。分别是:parse_header_of_csv()、 parse_body_of_csv().
> 值得注意的是在这里,我们使用的Python,Python在IO输入的时候和Python2有所不同,我们进行读取之后需要对其进行decode()操作,encoding为utf-8
parse_header_of_csv(csv_str)函数:由于我们直接将csv文件整个进行输入,所以我们直接将其作为一个大的str进行分析,我们通过判断\n的位置,进行对heading(column)的截取。为了更为严谨,我们在其中插入了assert函数进行判断,截取之后再使用enumerate对column进行从新标号,判断label开始的位置,得到位置之后在依旧使用enumrate对其进行分析,对label标签进行处理,return (feature_names, label_names)
parse_body_of_csv(csv_str,n_feature)函数:我们使用使用numpy中的loadtxt进行读取,以StringIo进行读取,在将feature和label进行分割。
```
#分离出所有label数据
trinary_labels_mat = full_body[:,(n_feature+1):-1]
M = np.isnan(trinary_labels_mat)# 将其进行判断有哪些是nan值
Y = np.where(M,0,trinary_labels_mat)>0.
##进行判断哪里有Nan值则将其转化为0,则保留原来的数值
##并将其转化为布尔值
```
由上我们得到状态存在矩阵M,同时使用where函数对其进行从新置换。
网友评论