任务描述
本次数据处理任务需要处理101227行数据,数据样例如下:
18 Jogging 102271561469000 -13.53 16.89 -6.4
18 Jogging 102271641608000 -5.75 16.89 -0.46
18 Jogging 102271681617000 -2.18 16.32 11.07
18 Jogging 3.36
18 Downstairs 103260201636000 -4.44 7.06 1.95
18 Downstairs 103260241614000 -3.87 7.55 3.3
18 Downstairs 103260321693000 -4.06 8.08 4.79
18 Downstairs 103260365577000 -6.32 8.66 4.94
18 Downstairs 103260403083000 -5.37 11.22 3.06
18 Downstairs 103260443305000 -5.79 9.92 2.53
6 Walking 0 0 0 3.214402
Step 1
将数据集中所有信息异常的行删除。
比如上面的样例中第4行数据只有3个元素,而其他行都有6个元素,所以第4行是信息异常的行,将其删除。再如第12行数据的第3个元素明显也是有问题的,所以它也是信息异常的行,将其删除。
数据集中可能还会存在一些其他异常。
将全部信息处理之后,每行的元素以逗号为分隔符,写入文件test1
。
文件test1
共100471行,样例如下:
6,Walking,23445542281000,-0.72,9.62,0.14982383
6,Walking,23445592299000,-4.02,11.03,3.445948
6,Walking,23470662276000,0.95,14.71,3.636633
...
Step1思路:
该问题本质为对异常行的处理,那么我们只需筛选出符合要求的行写入新文件即可,通过观察得知文件中的异常行无外乎两种,第一种为文件中每一行的元素少于六个的异常,第二种则是一行中出现过多的0这种明显错误,所以只需去除这两类异常行即可
Step1代码实现:
file1=open("OriginalData.txt")
file2=open("test1.txt",'w')#基本的文件读取操作
while True:
str=file1.readline()#依次读取每一行
if str:
ele_list=str.split(' ')#将各个元素分隔
if len(ele_list)<6 or len(str)<35:
continue#判断元素是否为六个和每一行的长度是否到达正常数据的长度
for li in ele_list[2:-1]:#判断所有数字位
if not li.strip('-').replace('.','').isdigit():
break#去掉负号和小数点后判断是否为纯数字
#isdigit()函数判断字符串是否只包含数字并返回一个bool值
else:
str=str.replace(' ',',')#满足任务要求用逗号分割所有元素
file2.write(str)#写入文件
else:
break
file1.close()
file2.close()
Step1结果
6,Walking,23445542281000,-0.72,9.62,0.14982383
6,Walking,23445592299000,-4.02,11.03,3.445948
6,Walking,23470662276000,0.95,14.71,3.636633
6,Walking,23470712295000,-3.57,5.75,-5.407278
6,Walking,23470762252000,-5.28,8.85,-9.615966
6,Walking,23470812301000,-1.14,15.02,-3.8681788
6,Walking,23470862227000,7.86,11.22,-1.879608
6,Walking,23470912307000,6.28,4.9,-2.3018389
6,Walking,23470962233000,0.95,7.06,-3.445948
6,Walking,23471012252000,-1.61,9.7,0.23154591
6,Walking,23471062240000,6.44,12.18,-0.7627395
6,Walking,23471112288000,5.83,12.07,-0.53119355
6,Walking,23471162276000,7.21,12.41,0.3405087
6,Walking,23471212295000,6.17,12.53,-6.701211
Step 2
统计文件test1
的数据中所有动作的数目并打印到屏幕,然后将动作数目对100取整后写入test2
文件,多余的信息行抛弃。比如统计出Jogging
的数量为3021
次,则在屏幕上打印Movement: Jogging Amount: 3021
,然后将前3000行信息写入test2
文件。
文件test2
共100200行。
Step2思路
当我看到动作都出现在每一行的第一列时,我邪魅一笑,这用字典不就行了吗,然后需要注意对每一个动作的数目都要对100取整后再写入文件中,下面上代码
Step3代码实现
file1=open('test1.txt')
file2=open('test2.txt','w')
moveamount={}#定义了一个字典来存储动作
def seekmovement(movement,amount):
file1.seek(0)#文件指针重置
count=0
while True:
str=file1.readline()#读取一行
if str:
if movement==str.split(',')[1] and count<amount:
file2.write(str)
count+=1#仅当次数未超过对100取整后的值时写入
else:
break
while True:
str=file1.readline()#读取一行
if str:
movement=str.split(',')[1]#我们发现动作总位于每一行数据的第一列,故可以直接用split(',')[1]返回动作
if movement in moveamount:
moveamount[movement]+=1#若该动作位于字典中,该动作次数+1
else:
moveamount[movement]=1#若不存在该动作则添加该动作
else:
break
for movement in moveamount:
seekmovement(movement,moveamount[movement]//100*100)#对100取整
print('\n'.join(["Movement: %s ;Amount: %s"%(movement,moveamount[movement]) for movement in moveamount]))#最后在屏幕上输出不同动作的统计数量
file1.close()
file2.close()
Step2处理结果
6,Walking,23473302260000,5.71,12.53,-0.3405087
6,Walking,23473352309000,6.7,10.69,3.336985
6,Walking,23473402297000,3.15,14.06,-1.7978859
6,Walking,23473452315000,-0.76,18.7,-7.5456724
6,Walking,23473502273000,-0.19,15.05,1.1168685
6,Walking,23473552260000,4.94,8.31,-3.759216
6,Walking,23473602309000,-2.22,6.17,-3.8273177
6,Walking,23473652297000,-4.02,-0.38,-4.8216033
6,Walking,23473702285000,-4.63,2.96,-3.405087
6,Walking,23473752303000,-0.65,11.41,4.9850473
屏幕输出如下:
Movement: Walking ;Amount: 36503
Movement: Jogging ;Amount: 36494
Movement: Upstairs ;Amount: 11052
Movement: Downstairs ;Amount: 8860
Movement: Standing ;Amount: 3838
Movement: Sitting ;Amount: 3723
Step 3
读取文件test2
的数据,取每行的后3列元素,以空格为分隔符写入文件test3
。
文件test3
共100200行,样例如下:
-0.72 9.62 0.14982383
-4.02 11.03 3.445948
0.95 14.71 3.636633
...
Step3思路:
对列进行筛选,无难操作
Step3代码实现
file1=open('test2.txt')
file2=open('test3.txt','w')
while True:
str=file1.readline()
if str:
file2.write(' '.join(str.split(',')[-3:]))#直接在写入时进行筛选,同时为满足任务要求在后三列元素中加入空格
else:
break
file1.close()
file2.close()
Step3结果
-0.72 9.62 0.14982383
-4.02 11.03 3.445948
0.95 14.71 3.636633
-3.57 5.75 -5.407278
-5.28 8.85 -9.615966
-1.14 15.02 -3.8681788
7.86 11.22 -1.879608
6.28 4.9 -2.3018389
0.95 7.06 -3.445948
-1.61 9.7 0.23154591
6.44 12.18 -0.7627395
5.83 12.07 -0.53119355
Step 4
读取文件test3
的数据,每行数据为一组,每组组内的元素以空格为分隔符,组与组之间的数据以逗号为分隔符,每20组元素为一行,写入文件finally
。
文件finally
共5010行,样例如下:
-0.72 9.62 0.14982383,-4.02 11.03 3.445948,0.95 14.71 3.636633,-3.57
5.75 -5.407278,-5.28 8.85 -9.615966,-1.14 15.02 -3.8681788,7.86 11.22
-1.879608,6.28 4.9 -2.3018389,0.95 7.06 -3.445948,-1.61 9.7
0.23154591,6.44 12.18 -0.7627395,5.83 12.07 -0.53119355,7.21 12.41
0.3405087,6.17 12.53 -6.701211,-1.08 17.54 -6.701211,-1.69 16.78
3.214402,-2.3 8.12 -3.486809,-2.91 0 -4.7535014,-2.91 0
-4.7535014,-4.44 1.84 -2.8330324
Step4思路
主要需要考虑的问题为如何将每20组元素写入一行,那么可以想到可以定义一个flag值,每写入1组元素flag值就加1,那么该问题就迎刃而解了
Step4代码实现
file1=open('test3.txt')
file2=open('finally.txt','w')
amount=0#amount即为所立的flag值
while True:
str=file1.readline()
if str:
file2.write(str[:-1]+',')#满足组与组之间以逗号为间隔
amount+=1
if not amount%21:#若amount到达21时应该写入换行符
amount=1
file2.write('\n')
else:
break
file1.close()
file2.close()
Step4结果
-0.72 9.62 0.14982383,-4.02 11.03 3.445948,0.95 14.71 3.636633,-3.57 5.75 -5.407278,-5.28 8.85 -9.615966,-1.14 15.02 -3.8681788,7.86 11.22 -1.879608,6.28 4.9 -2.3018389,0.95 7.06 -3.445948,-1.61 9.7 0.23154591,6.44 12.18 -0.7627395,5.83 12.07 -0.53119355,7.21 12.41 0.3405087,6.17 12.53 -6.701211,-1.08 17.54 -6.701211,-1.69 16.78 3.214402,-2.3 8.12 -3.486809,-2.91 0 -4.7535014,-2.91 0 -4.7535014,-4.44 1.84 -2.8330324,0.38 10.08 7.668256,
14.48 16.97 5.7886477,-0.99 0.08 -2.1383946,-2.91 9.08 0.08172209,3.45 13.18 -2.5606253,-4.82 6.24 -7.8861814,-2.72 12.41 -3.759216,6.05 12.95 -3.5276701,6.89 5.9 -0.42223078,1.31 7.21 -2.8738933,-1.42 9 -0.5720546,4.6 11.5 -1.3756552,6.4 11.5 -0.9942854,7.31 12.15 0.7627395,6.36 12.03 2.6423476,0.95 16.89 -2.9147544,-2.75 19.46 -1.0760075,1.12 10.99 -3.9090397,1.95 8.92 -2.8738933,-2.22 3.87 -3.636633,-3.6 -0.38 -5.366417,
-4.71 4.63 -2.8330324,7.46 14.94 14.137921,9.77 12.34 3.445948,0 2.11 -4.5900574,0.38 17.27 1.0351465,-3.06 6.09 -4.2904096,-6.17 9.28 -6.5513873,0.53 14.33 -3.336985,9.15 9.23 -2.4108016,4.48 6.24 -2.8738933,-0.57 8.43 0.9942854,4.44 11.14 -2.7240696,5.98 12.45 0.53119355,5.71 12.53 -0.3405087,6.7 10.69 3.336985,3.15 14.06 -1.7978859,-0.76 18.7 -7.5456724,-0.19 15.05 1.1168685,4.94 8.31 -3.759216,-2.22 6.17 -3.8273177,
-4.02 -0.38 -4.8216033,-4.63 2.96 -3.405087,-0.65 11.41 4.9850473,15.24 16.32 6.3198414,1.92 -0.34 -3.5957718,-1.95 12.76 2.982856,0.5 8.73 -6.2108784,-7.78 8.69 -7.8589406,-1.46 16.21 -3.9771416,4.75 5.83 -1.920469,-0.19 6.51 -0.46309182,2.6 10 -1.7570249,7.74 10.53 -1.9477097,4.48 13.53 -0.23154591,7.67 12.3 1.879608,5.24 11.88 1.3075534,-0.3 16.44 -5.5162406,-1.23 18.96 2.8738933,3.15 9.96 -4.5900574,-0.76 8.77 -3.0645783,
-2.56 1.23 -3.8681788,-4.56 0.27 -4.140586,-2.64 6.17 -1.6889231,13.67 18.31 13.211738,3.49 6.89 0.50395286,-4.1 5.28 -4.0588636,4.06 15.51 -1.3075534,-3.64 7.4 -8.730643,-2.91 11.37 -4.3312707,4.67 13.72 -2.9556155,6.82 6.47 -1.2258313,2.34 7.08 -4.440233,-0.5 8.54 1.1441092,3.91 10.46 -2.5333846,5.28 11.96 0.42223078,5.13 11.75 -0.9942854,7.82 11.11 2.4925237,4.14 13.25 -0.7218784,-0.61 16.97 -6.1700177,-0.65 17.67 1.4165162,
4.18 10.65 -4.671779,-1.14 9.53 -2.982856,-3.34 1.42 -4.7126403,-4.56 0.19 -3.636633,-3.87 6.02 -0.53119355,13.91 17.5 13.947236,6.05 7.44 1.4573772,-2.56 8.85 -2.3699405,4.4 10.65 -3.8273177,-5.67 7.16 -10.651112,-2.56 15.21 -4.440233,4.79 13.29 -3.214402,5.48 5.67 -2.6832085,3.38 7.7 -3.0645783,1.57 7.25 -0.3405087,2.37 10.69 -1.8387469,5.71 11.26 0.5720546,5.71 11.88 0.040861044,8.2 10.61 1.4573772,3.17 16.21 -1.2258313,
以上,数据处理任务整理完毕,下面说说自己在处理任务的不足:首先,在完成相关任务时对python中常见的函数的参数记忆不是很牢,通过查询才顺利完成任务。第二,没有使用寒假学到python中的csv文件处理部分,没有很好的巩固csv操作。但还是把任务完成了,若读者在阅读时对代码有什么问题,请在评论区中提出,大家共同学习 ♪(^ ∇ ^*)