寒假数据处理任务整理

任务描述
本次数据处理任务需要处理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操作。但还是把任务完成了,若读者在阅读时对代码有什么问题,请在评论区中提出,大家共同学习 ♪(^ ∇ ^*)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值